# higher order functions
higher order beacuse return function
- forEach
- map
- filter
- reduce
## ForEach
forEach is not a return function
direct iterate
Syntax
```javascript=
// first parameter is value
[0, 1, 2, 3].forEach(function(value) {
console.log(value)
})
```
// output
```shell=
0
1
2
3
```
with index
```javascript=
// second parameter is index
["delhi", "goa", "up", "mp"].forEach(function(value, index) {
console.log(index, value);
})
```
// output
```shell=
0 "delhi"
1 "goa"
2 "up"
3 "mp"
```
// backend of code
```javascript=
function forEach(list, callback) {
for (var i = 0; i < list.length; i++) {
callback(
list[i], // value
i // index
)
}
}
```
## map
map is return function
generate new list from given/old list
```javascript=
// example number
var list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var tableOf5 = list.map(function(value){
return value * 5;
})
var tableOf6 = list.map(function(value){
return value * 6;
})
// output
// [5, 10, 15, 20, ....., 50]
// [6, 12, 18, 24, ....., 60]
```
```javascript=
// example of string
var states = ["delhi", "goa", "up", "mp"];
var isGood = states.map(function(value) {
return value + " is good";
})
// output
// ["delhi is good", "goa is good", "up is good", "mp is good"]
```
## filter
return function but condition check
generate new list from given/old list
```javascript=
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var even = numbers.filter(function(value) {
return value % 2 == 0;
})
var odd = numbers.filter(function(value) {
return value % 2 != 0;
})
```
## reduce
merge given value
generate new list from given/old list|combine string
```javascript=
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// reduce
// first parameter function
// first parameter is initial value
// second parameter is list value
// second parameter initial value
var sum = numbers.reduce(function(a, value){
return a + value
}, 0)
// output
// 55
var sum = numbers.reduce(function(a, value){
return a + value
}, '')
// output
// 012345678910
```
## call by value and call by reference
### call by value
```javascript=
var t = 10;
var t2 = t;
console.log(t);
// 10
console.log(t2);
// 10
// Change value
t2 = 20;
console.log(t2);
// 20
console.log(t);
// 10
```
### call by reference
```javascript=
var t = [0, 1, 2];
var t2 = t;
console.log(t);
// [0, 1, 2]
console.log(t2);
// [0, 1, 2]
// Change list
t2.push(10);
console.log(t2);
// [0, 1, 2, 10]
console.log(t);
// [0, 1, 2, 10]
```