我在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參數的數量需要的功能,「添加」(但它應該與每一個功能的工作),所以我可以選擇何時返回另一個函數或函數的直接結果「添加」 。
bacause如果我用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)回報的東西是不是 「空」或「NaN」,但我認爲並不是真正的高性能,然後我想用這些論據進行工作。
*如果*您可以假設傳遞的函數只需要定義多少個參數,然後就可以找出函數的'.length'屬性有多少。所以你的'add'函數將會有'add.length; // 3'。那麼你可以將這個數字與傳遞給你返回函數的參數數量進行比較。 – 2013-05-10 11:44:19
我試圖避免屬性.length因爲需要傳遞的所有參數的數量,所以可能是每個數量的數量,但如果我遵循你的推理,你是對的。我也認爲也適用於附加範圍,如 v.len = 3(如斯佩蘭斯基丹尼爾的迴應) 但我希望找到一個本地適當的功能,但在這一點上,我認爲它不存在... – 2013-05-10 12:47:39
函數的本地屬性是我在上面的評論中描述的。函數具有'.length'屬性,該屬性描述爲該函數定義了多少個參數。是的,一個人可以添加一個'.len',但爲什麼同一個人不會簡單地定義合適的參數數量? – 2013-05-10 12:54:33