高階函數(shù)的英文名叫 Higher-Order Function,熟悉 React 的朋友應(yīng)該知道高階組件 Higher-Order Component。沒(méi)錯(cuò),React 的高階組件本質(zhì)上就是高階函數(shù)。
那么,什么是高階函數(shù)呢?
高階函數(shù)源自于函數(shù)式編程(不熟悉的朋友請(qǐng)看《javascript中的函數(shù)式編程》),是函數(shù)式編程的基本技術(shù)。
那么,JS作為一門(mén)“一切皆為對(duì)象”的語(yǔ)言,是如何擁有函數(shù)式編程的能力呢?
是因?yàn)樵贘S中函數(shù)是一等公民,即函數(shù)可以被賦值給變量,被變量引用,這便使得函數(shù)可以作為參數(shù),在其他函數(shù)間相互傳遞:
/**
* 數(shù)值轉(zhuǎn)換
* @param {Number} val 要被處理的數(shù)值
* @param {Function} fn 處理輸入的val
* @return {Number || String}
*/
const toConvert = function(val, fn) {
return fn(val);
};
const addUnitW = function(val) {
return val + 'W';
};
toConvert(123.1, Math.ceil); // 124
toConvert(123.1, addUnitW); // "123.1W"
另外,JS的回調(diào)函數(shù)同樣是以實(shí)參形式傳入其他函數(shù)中,這也是高階函數(shù)(在函數(shù)式編程中回調(diào)函數(shù)被稱(chēng)為 lambda表達(dá)式):
[1, 2, 3, 4, 5].map(d => d ** 2); // [1, 4, 9, 16, 25]
// 以上,等同于:
const square = d => d ** 2;
[1, 2, 3, 4, 5].map(square); // [1, 4, 9, 16, 25]