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