javascript之高阶函数

高阶函数英文叫Higher-order function。那么什么是高阶函数?
在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:

  • 接受一个或多个函数作为输入
  • 输出一个函数

###高阶函数之把函数当做参数
JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

一个最简单的高阶函数:

1
2
3
4
5
6
function sum (x, y, f){
return f(x) + f(y)
}
```
当我们调用sum(-2,6, Math.abs)时,参数x,y和f分别接收-2,6和函数Math.abs(求绝对值),根据函数定义,我们可以推导计算过程为:

x = -2;y =6;f = Math.abs;f(x) + f(y) ==> Math.abs(-2) + Math.abs(6) ==>2+6 ;return 8

1
用代码验证一下:

sum(-2,6,Math.abs);//8

1
2
再举一个大家都熟悉的例子,Array.prototype.sort方法,接受一个函数当作参数,函数里面封装的是对数组进行排序的规则。

var arr = [1, 3, 5, 7, 2, 4, 6];
arr.sort(function(a, b) {
return a - b; //从小到大排序,如需从大到小排序,只需return b - a;
});

1
2
3
4
5
6
7
编写高阶函数,就是让函数的参数能够接收别的函数。还有常见的事件绑定回调函数,ajax回调函数等都属于高阶函数。
###高阶函数之返回值输出
在JavaScript中,函数是第一类对象,其既可以作为参数传递,也可以作为其他函数的返回值输出。
高阶函数还可作为一种模式的构造器,比如有若干排序算法(快排,冒泡,希尔等),就可以生成一个排序器。

//排序器
var sortGenerator = function(sortFunc){
return function(args){
var arguments = [].slice.call(args);
return sortFunc(arguments);
}};

1
2

//引入快速排序算法
var quickSort = require(‘quickSort.js’);
var quickSorter = sortingGenerator(quickSort);
//应用算法
quickSorter (4, 22, 44, 66, 77);

1
2
3
也许你会有疑惑我直接应用require进来的 quickSort() 就不行了。干嘛多此一举?多包装一层就可以干更多额外的事。比如测试每个排序算法的耗时。
再举个ajax封装的列子,我们写好了一个简单ajax请求服务器数据的功能,接受两个参数method和callback。请求类型和回调。每次都传入请求类型很麻烦。那么我们生成两个新的函数一个ajaxGet一个ajaxPost。

var ajaxGenerator=function(method){
return function( callback ){
ajax( method, ‘/url’, callback )
}
}
var ajaxGet=ajaxGenerator(‘get’)
ajaxGet(mycallback )

var ajaxPost=ajaxGenerator(‘post’)
ajaxPost(mycallback )
```
以上像不像函数的柯里化,是的它属于高阶函数的降阶。

文章目录
,