概念
高階函數(shù) Higher-order function谒撼,簡而言之就是將一個函數(shù)作為參數(shù)的函數(shù)楼咳。
在數(shù)學(xué)和計算機科學(xué)中熄捍,高階函數(shù)是至少滿足下列一個條件的函數(shù):
- 接受一個或多個函數(shù)作為輸入
- 輸出一個函數(shù)
條件一:接受一個或多個函數(shù)作為輸入
javascript 的函數(shù)其實都指向某個變量。函數(shù)的參數(shù)能接收變量母怜,那么也能接收一個函數(shù),能接收函數(shù)作為參數(shù)的函數(shù)可稱為高階函數(shù)缚柏。
const sum = (x, y, f) => {
return f(x) + f(y);
};
調(diào)用 sum(-1, 1, Math.abs)時苹熏,推導(dǎo)過程
x = -1; y = 1; f = Math.abs; f(x) + f(y) ==> Math.abs(-1) + Math.abs(1) ==> 1 + 1; return 2
用代碼驗證一下
sum(-1, 1, Math.abs); // 2
再舉個例子,Array.prototype.sort 方法币喧,接收一個參數(shù)作為參數(shù)轨域,函數(shù)里面封裝的是對數(shù)組進行排序的規(guī)則。
const arr = [1, 3, 5, 2, 4, 9, 0];
const desc = function(a, b) {
return b - a;
};
arr.sort(desc);
編寫高階函數(shù)杀餐,就是讓函數(shù)的參數(shù)能夠接收別的函數(shù)干发。還有常見的事件綁定回調(diào)函數(shù),ajax 回調(diào)函數(shù)等都屬于高階函數(shù)史翘。
條件二:返回值輸出
函數(shù)既可以作為參數(shù)傳遞輸入枉长,也可以作為其他函數(shù)的返回值輸出冀续。
高階函數(shù)還可作為一種模式的構(gòu)造器,比如若干排序算法(快排必峰、冒泡洪唐、希爾等),就可以生成一個排序器吼蚁。
const desc = (a, b) => {
return b - a;
};
const sortGenerator = desc => {
return (...args) => {
return args.sort(desc);
};
};
console.log(sortGenerator(desc)(1, 2, 3)); // [ 3, 2, 1 ]
或許你會好奇可以調(diào)用一次函數(shù)凭需,為嘛多此一舉?多包裝一層就可以干很多額外的事肝匆。比如測試每個排列算法的耗時粒蜈。
再舉個 ajax 封裝的例子,接收兩個參數(shù) method 和 callback旗国,即請求類型和回調(diào)薪伏。每次都傳入請求類型很麻煩,那么生成兩個新的函數(shù) ajaxGet 和 ajaxPost.
const ajaxGenerator = method => {
return (url, callback) => {
ajax(method, url, callback);
};
};
const ajaxGet = ajaxGenerator("GET");
const ajaxPost = ajaxGenerator("POST");
ajaxGet("/v1/api/getUser", myCallback);
ajaxPost("/v1/api/getUser", myCallback);
以上像不像函數(shù)的柯里化粗仓,是的它屬于高階函數(shù)的降級嫁怀。