// 利用了会自动调用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