函数柯西化(经典面试题)
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;function add() {var _args = Array.prototype.slice.call(arguments);var _adder = function() {_args.push(...arguments);return _adder;};_adder.toString = function () {return _args.reduce(function (a, b) {return a + b;});}return _adder;
}add(1)(2)(3)
add(1, 2, 3)(4)
add(1)(2)(3)(4)(5)
add(2, 6)(1)
加强理解版本
function curry(fn, ...args) {return function () {return fn.apply(this, args.concat([].slice.call(arguments)));}
}
function add(a, b) {return a + b;
}var addCurry = curry(add, 1, 2);
console.log(addCurry());
var addCurry = curry(add, 1);
console.log(addCurry(2));
var addCurry = curry(add);
console.log(addCurry(1, 2));
function sub_curry(fn) {let args = [].slice.call(arguments, 1);return function () {return fn.apply(this, args.concat([].slice.call(arguments)));}
}function curry(fn, length) {length = length || fn.length;let slice = Array.prototype.slice;return function () {}
}
function curryFn(fn, args) {let length = fn.length; args = args || []; return function () {let _args = args.slice(0);for (let i = 0; i < arguments.length; i++) {_args.push(arguments[i]);}if (_args.length < length) {return curryFn.call(this, fn, _args);}else {return fn.apply(this, _args);}}
}let fn = curryFn(function(a, b, c) {console.log([a, b, c]);
});fn("a", "b", "c")
fn("a", "b")("c")
fn("a")("b")("c")
fn("a")("b", "c")