// 最终版本
function multi() {
const args = Array.prototype.slice.call(arguments)
const fn = function(){
const newArgs = args.concat(Array.prototype.slice.call(arguments))
return multi.apply(this, newArgs)
}
fn.toString = function() {
return args.reduce((a, b) => a * b)
}
return fn
}
console.log(multi(2, 3, 4))
console.log(multi(3)(4)(5))
// 固定参数版本
// function curry(fn, args) {
// var length = fn.length;
// args = args || [];
// return function() {
// var _args = args.slice(0),
// arg, i;
// for (i = 0; i < arguments.length; i++) {
// arg = arguments[i];
// _args.push(arg);
// }
// if (_args.length < length) {
// return curry.call(this, fn, _args);
// }
// else {
// return fn.apply(this, _args);
// }
// }
// }
// var fn = curry(function(a, b, c) {
// console.log([a, b, c]);
// });
// fn("a", "b", "c") // ["a", "b", "c"]
// fn("a", "b")("c") // ["a", "b", "c"]
// fn("a")("b")("c") // ["a", "b", "c"]
// fn("a")("b", "c") // ["a", "b", "c"]
console