1.?函數柯里化是什么?
函數柯里化是一種將多參數函數轉換成一系列單參數函數的技術。簡單來說,就是把一個接收多個參數的函數,變成每次只接收一個參數,并返回一個新函數,直到所有參數都接收完畢,最后返回結果。
舉個例子:
-
普通函數:
add(a, b, c)
,一次性接收 3 個參數。 -
柯里化函數:
add(a)(b)(c)
,每次只接收 1 個參數,分 3 次調用。
2.?為什么需要函數柯里化?
柯里化的主要作用是:
-
參數復用:可以固定一部分參數,生成一個新的函數,方便復用。
-
延遲執行:可以在需要的時候再傳入剩余的參數,延遲函數的執行。
-
函數組合:方便將多個函數組合在一起,形成更復雜的邏輯。
3.?函數柯里化的實現
3.1?普通函數
function add(a, b, c) {return a + b + c;
}console.log(add(1, 2, 3)); // 輸出 6
3.2?柯里化函數
function curriedAdd(a) {return function(b) {return function(c) {return a + b + c;};};
}console.log(curriedAdd(1)(2)(3)); // 輸出 6
-
第一次調用?
curriedAdd(1)
,返回一個新函數。 -
第二次調用?
返回的函數(2)
,再返回一個新函數。 -
第三次調用?
返回的函數(3)
,最終返回結果?6
。
3.3?通用的柯里化函數
我們可以寫一個通用的柯里化函數,將任意多參數函數轉換成柯里化函數:
function curry(fn) {return function curried(...args) {if (args.length >= fn.length) {return fn.apply(this, args);} else {return function(...moreArgs) {return curried.apply(this, args.concat(moreArgs));};}};
}// 使用柯里化函數
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 輸出 6
4.?函數柯里化的應用場景
4.1?參數復用
柯里化可以固定一部分參數,生成一個新的函數,方便復用。
function add(a, b, c) {return a + b + c;
}const curriedAdd = curry(add);
const add2 = curriedAdd(2); // 固定第一個參數為 2
console.log(add2(3)(4)); // 輸出 9 (2 + 3 + 4)
4.2?延遲執行
柯里化可以延遲函數的執行,直到所有參數都傳入。
function log(date, level, message) {console.log(`[${date.getHours()}:${date.getMinutes()}] [${level}] ${message}`);
}const curriedLog = curry(log);
const logNow = curriedLog(new Date()); // 固定第一個參數為當前時間
logNow('INFO')('This is a message.'); // 輸出:[12:30] [INFO] This is a message.
4.3?函數組合
柯里化可以方便地將多個函數組合在一起,形成更復雜的邏輯。
function compose(f, g) {return function(x) {return f(g(x));};
}const add1 = x => x + 1;
const multiply2 = x => x * 2;const addThenMultiply = compose(multiply2, add1);
console.log(addThenMultiply(5)); // 輸出 12 (5 + 1 = 6, 6 * 2 = 12)
5.?函數柯里化的優缺點
5.1?優點
-
代碼復用:可以固定一部分參數,生成新的函數。
-
靈活性:可以延遲執行,方便函數組合。
-
可讀性:將多參數函數拆分成單參數函數,邏輯更清晰。
5.2?缺點
-
性能開銷:每次調用都會生成一個新的函數,可能會增加內存和性能開銷。
-
復雜性:對于初學者來說,柯里化的概念可能不太容易理解。
6.?總結
-
函數柯里化:將多參數函數轉換成一系列單參數函數。
-
作用:參數復用、延遲執行、函數組合。
-
實現:通過返回新函數,逐步接收參數,直到所有參數都傳入。
-
應用場景:參數復用、延遲執行、函數組合等。