高階函數(shù)是操作其他函數(shù)的函數(shù)。舉個例子,一個函數(shù)可以將其他函數(shù)作為參數(shù)和/或產(chǎn)生一個函數(shù)作作為它的返回值。 精巧的 功能技術(shù)是非常強大的構(gòu)造,可在Javascript或其他高級語言比如python,lisp等中使用。
我們來創(chuàng)建兩個簡單的函數(shù),add_2 和 double ,和一個高階函數(shù) map 。map 接受兩個參數(shù),func 和 list (它的聲明因此為map(func,list)),返回一個數(shù)組。func (第一個參數(shù))作為函數(shù)將被應(yīng)用到每個數(shù)組 list(第二個參數(shù))的每一個元素中。
// 定義兩個簡單函數(shù)
var add_2 = function(x) {
return x + 2;
};
var double = function(x) {
return 2 * x;
};
// map接受兩個參數(shù)
// func 調(diào)用函數(shù)
// list 數(shù)組中元素值傳遞給 func
var map = function(func, list) {
var output=[]; // 輸出 list
for(idx in list) {
output.push( func(list[idx]) );
}
return output;
}
// 使用map將函數(shù)應(yīng)用于整個輸入列表
// 產(chǎn)生相應(yīng)的輸出列表
map(add_2, [5,6,7]) // => [7, 8, 9]
map(double, [5,6,7]) // => [10, 12, 14]
上述例子中的函數(shù)很簡單。然而在作為參數(shù)傳遞給其他函數(shù)時,可以使用特殊組合方法構(gòu)件更復(fù)雜的函數(shù)。
舉個例子,如果注意到在代碼中平凡使用調(diào)用方法map(add_2, ...) 和 map(double, ...),可以創(chuàng)建兩個特殊用途的列表運行組合起來的函數(shù)。使用函數(shù)封裝,可以如下操作:
process_add_2 = function(list) {
return map(add_2, list);
}
process_double = function(list) {
return map(double, list);
}
process_add_2([5,6,7]) // => [7, 8, 9]
process_double([5,6,7]) // => [10, 12, 14]
創(chuàng)建一個 buildProcessor 函數(shù),它將函數(shù) func 作為函數(shù),返回一個 func處理程序,這個函數(shù)將列表作為輸入應(yīng)用到 func 。
// 函數(shù)產(chǎn)生一系列處理程序
var buildProcessor = function(func) {
var process_func = function(list) {
return map(func, list);
}
return process_func;
}
// 調(diào)用buildProcessor返回一個調(diào)用輸入列表的函數(shù)
// 使用buildProcessor產(chǎn)生 add_2 process_double:
process_add_2 = buildProcessor(add_2);
process_double = buildProcessor(double);
process_add_2([5,6,7]) // => [7, 8, 9]
process_double([5,6,7]) // => [10, 12, 14]
看另一個例子。
創(chuàng)建一個 buildMultiplier 函數(shù),將 x 作為輸入,然后一個對其參數(shù) x 相乘的函數(shù):
var buildMultiplier = function(x) {
return function(y) {
return x * y;
}
}
var double = buildMultiplier(2);
var triple = buildMultiplier(3);
double(3); // => 6
triple(3); // => 9
{% exercise %}
定義一個 negate 函數(shù)將 add1 作為參數(shù),返回一個函數(shù),這個函數(shù)通過 add1 返回值的相反數(shù).(開始有點復(fù)雜了)
{% initial %}
var add1 = function (x) {
return x + 1;
};
var negate = function(func) { // TODO };
// 應(yīng)該返回 -6 // 因為 (5+1) * -1 = -6 negate(add1)(5);
{% solution %} var add1 = function (x) { return x + 1; }
var negate = function(func) { return function(x) { return -1 * func(x); } }
negate(add1)(5); {% validation %} assert(negate(add1)(5) === -6); {% endexercise %}