我正在研究curring函数和部分应用程序,我正在尝试改进函数schonfinkelize:
function schonfinkelize(fn){
var
slice = Array.prototype.slice,
stored_args = slice.call(arguments, 1);
return function(){
var
new_args = slice.call(arguments),
args = stored_args.concat(new_args);
return fn.apply(null, args);
}
}
这个函数允许作为参数传递一个函数和作为参数传递的函数的一部分参数(部分应用程序),所以第一次返回一个函数,然后当你再次触发函数时返回结果。
function add(x, y, z){
return x + y + z;
}
var val = schonfinkelize(add, 1, 2);
console.log( val(3) ) // console output--> 6
我想在 schonfinkelize 内部检查函数“add”所需的参数数量(但它应该适用于每个函数),因此我可以选择何时返回另一个函数或直接返回函数“add”的结果。
因为如果我以这种方式使用 schonfinkelize:
var val2 = schonfinkelize(add, 1, 2, 3);
console.log( val2 ) // --> function
console.log( val2() ) // --> 6
我必须两次触发该函数,而不是希望避免这种行为并在参数足够的情况下直接定义值。
可能的解决方案如下:
function schonfinkelize(fn){
var
slice = Array.prototype.slice,
stored_args = slice.call(arguments, 1);
//* I have added this ********
if(fn.apply(null, stored_args))
return fn.apply(null, stored_args);
//****************************
return function(){
var
new_args = slice.call(arguments),
args = stored_args.concat(new_args);
return fn.apply(null, args);
}
}
可能是因为如果fn.apply(null, stored_args)返回的结果不是“null”或“NaN”,但我认为它的性能并不高,然后我想使用这些参数,它会立即返回结果。