// 利用了會自動調用toString方法
// 具體和valueOf了解可以看https://blog.csdn.net/FE_dev/article/details/77151434
function add(m) {
var temp = function(n) {
return add(m + n);
}
temp.toString = function() {
return m;
}
return temp;
}
add(1)(2)(3); // 6
// 這句話道出了精髓:用閉包把參數保存起來,當參數的數量足夠執行函數了,就開始執行函數。
// 引用:https://github.com/mqyqingfeng/Blog/issues/42
var curry = function(fn) {
// 獲取非fn參數數組
var args = [].slice.call(arguments, 1);
return function() {
var allArgs = [...args, ...[].slice.call(arguments)];
return fn.apply(this, allArgs);
}
}
// 指定固定的參數
function add(a, b) {
console.log(a + b);
return a + b;
}
var addCurry = curry(add, 1, 2);
addCurry(); // 1 + 2
var addCurry = curry(add, 1);
addCurry(2); // 1 + 2
var addCurry = curry(add);
addCurry(1, 2); // 1 + 2
addCurry(1)(2);
// 但是還沒有達到具體的預期,我們要實現多個參數函數轉換一系列使用單個參數的函數
var sub_curry = function(fn) {
// 獲取非fn參數數組
var args = [].slice.call(arguments, 1);
return function() {
var allArgs = [...args, ...[].slice.call(arguments)];
return fn.apply(this, allArgs);
}
}
var curry = function(fn, length) {
// 獲取函數的參數個數
var len = length || fn.length;
return function() {
var args = [].slice.call(arguments);
// 如果參數的數量匹配函數的參數,即執行函數
if (args.length === len) {
return fn.apply(this, args);
} else {
// 參數的數量和匹配函數的數量不匹配時,擠破腦袋想怎么把(1, 2)(3)湊成(1, 2, 3)
// (1, 2)(3)湊成(1, 2, 3)也就時如上第一版,這里取名為sub_curry
var combined = [fn].concat([].slice.call(arguments)); // combined就如同上面的arguments
return curry(sub_curry.apply(this, combined), len - arguments.length); //
}
}
}
var addCurry = curry(function(a, b, c) {
console.log(a + b + c);
return a + b + c;
});
addCurry(1, 2, 3); // 6
addCurry(1, 2)(3); // 6
addCurry(1)(2)(3); // 6
addCurry(1)(2, 3); // 6