function curry(fn){
var args=Array.prototype.slice.call(arguments,1);
return function(){
var innerArgs=Array.prototype.slice.call(arguments);
var finalArgs=args.concat(innerArgs);
return fn.apply(null,finalArgs);
}
}
function add(num1,num2){
return num1+num2;
}
var cur=curry(add,5);
console.log(cur(3));
当执行var cur=curry(add,5);时,各参数值为:
args:[5],
Array.prototype.slice.call(arguments):[fn,5],
fn的值为:
f add(num1,num2){
return num1+num2;
}
cur的值为:
function(){
var innerArgs=Array.prototype.slice.call(arguments);
var finalArgs=args.concat(innerArgs);
return fn.apply(null,finalArgs);
}
后面执行console.log(cur(3));
等于执行代码:
//args和fn的值不变
function(3){
var innerArgs=Array.prototype.slice.call(arguments);
var finalArgs=args.concat(innerArgs);
return fn.apply(null,finalArgs);
}
所以innerArgs=[3],
finalArgs=[5,3],
所以输出fn.apply(null,finalArgs);结果为8
对于第二个例子:
var cur=curry(add,5,12);
console.log(cur());
当执行代码var cur=curry(add,5,12);时,各参数值为:
args:[5,12]
Array.prototype.slice.call(arguments):[fn,5.12],
fn的值为:
f add(num1,num2){
return num1+num2;
}
cur的值为:
function(){
var innerArgs=Array.prototype.slice.call(arguments);
var finalArgs=args.concat(innerArgs);
return fn.apply(null,finalArgs);
}
后面执行console.log(cur());
等于执行代码:
function(){
var innerArgs=Array.prototype.slice.call(arguments);
var finalArgs=args.concat(innerArgs);
return fn.apply(null,finalArgs);
}
所以innerArgs=[],
finalArgs=[5,12]
所以输出fn.apply(null,finalArgs);结果为17