在通常的编程语言中,函数的参数只能是基本类型或者对象引用,返回值也只是基本数据类型或对象引用。但在Javascript中函数作为一等公民,既可以当做参数传递,也可以被当做返回值返回。
所谓高阶函数就是可以把函数作为参数,或者是将函数作为返回值的函数。
回调函数
代码复用是衡量一个应用程序的重要标准之一。通过将变化的业务逻辑抽离封装在回调函数中能够有效的提高代码复用率。
比如ES5中为数组增加的forEach方法,遍历数组,对每个元素调用同一个函数。
forEach方法中的function回调支持3个参数,第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身。
[].forEach(function(value, index, array) {
// ...
});
var forEach = function(arr, fn){
for (var i = 0, len = arr.length; i < len; i++) {
fn(arr[i], i, arr);
}
}
通过回调函数将业务的重点聚焦在回调函数中,而不必每次都要重复编写遍历代码。
偏函数
作为将函数当做返回值输出的典型应用就是偏函数。所谓偏函数是指创建一个调用另外一个部分——参数或变量已经预置的函数——的函数的用法。
Javascript对象都拥有三个属性:原型属性、类属性、可扩展性。
isString = function(obj){
return Object.prototype.toString.call(obj) === "[object String]";
}
isNumber = function(obj){
return Object.prototype.toString.call(obj) === "[object Number]";
}
isArray = function(obj){
return Object.prototype.toString.call(obj) === "[object Array]";
}
这几个函数中大部分代码是重复的,这时高阶函数便华丽丽的登场了:
isType = function(type) {
return function(obj) {
return Object.prototype.toString.call(obj) === "[object " + type + "]";
}
}
isString = isType('String');
isNumber = isType('Number');
isArray = isType('Array');
所以通过指定部分参数来返回一个新的定制函数的形式就是偏函数。