Higher order function
Pass function in functions:
Example 1:
function example(callback) {
callback(1); -> Output 1
callback(2); -> Output 2
callback(3); -> Output 3
}
example(function(arg){
console.log(arg);
}
Example 2:
function filterArray(array, predicate){
var result = [];
for (var i.....i++) {
var item = array[i];
if(!predicate(item)){
continue;
}
result.push(item);
}
return result;
}
var array = [1,2,3,4,5,6,7]'
var result = filterArray(array, function(item){
return item < 4;
});
console.log(result); -> 1,2,3
Example 3:
function lessThanFilter(lessThen){
return function(item){
return item < lessThan;
}
}
var lessThanFive = lessThanFilter(5);
console.log(lessThanFive(3), lessThanFive(10)); -> True and false
Example 4:
function add( a, b ) {
return a + b;
}
function partial( fn, a ) {
return function( b ) {
return fn( a, b );
};
}
var add5 = partial( add, 5 );
console.log(add5(4)); //9
More examples:
Eg:
var arr1 = [1,2,3];
console.log(arr1);
var arr2 = [];
for (var i = 0; i < arr1.length; i++) {
arr2.push(
arr1[i * 2]
);
};
console.log(arr2);
This can be improve by using functional programming:
function mapForEach(arr, fn){
var newArr = [];
for (var i = 0; i < arr1.length; i++) {
newArr.push(
fn(arr[i])
)
};
return newArr;
}
var arr2 = mapForEach(arr1, function(item){
return item * 2;
});
If we want to create our custom limiter:
var checkPastLimit - function(limiter, item){
return item > limiter;
}
var arr4 = mapForEach(arr1, checkPastLimit.bind(this, 1)); //1 is our limiter which is present using the bind
//We can create a function that just takes the limiter:
var checkPastLimitSimplified = function(limiter){
return function(limiter, item){
return item > limiter;
}.bind(this,limiter);
}
var arr5 = mapForEach(arr1, checkPastLimitSimplified(2));