現在,這是我能想到的最佳解決方案。
makeFunc = function (length, fn) {
switch (length) {
case 0 : return function() { return fn.apply(this, arguments); };
case 1 : return function (a) { return fn.apply(this, arguments); };
case 2 : return function (a,b) { return fn.apply(this, arguments); };
case 3 : return function (a,b,c) { return fn.apply(this, arguments); };
case 4 : return function (a,b,c,d) { return fn.apply(this, arguments); };
case 5 : return function (a,b,c,d,e) { return fn.apply(this, arguments); };
case 6 : return function (a,b,c,d,e,f) { return fn.apply(this, arguments); };
case 7 : return function (a,b,c,d,e,f,g) { return fn.apply(this, arguments); };
case 8 : return function (a,b,c,d,e,f,g,h) { return fn.apply(this, arguments); };
case 9 : return function (a,b,c,d,e,f,g,h,i) { return fn.apply(this, arguments); };
default : return function (a,b,c,d,e,f,g,h,i,j) { return fn.apply(this, arguments); };
}
};
用法示例:
var realFn = function() {
return "blah";
};
lengthSix = makeFunc(6, realFn);
lengthSix.length; // 6
lengthSix(); // "blah"
就個人而言,我總是畏縮,每當我使用複製和編程時粘貼,所以我會很高興聽到任何更好的選擇。
更新
我想這可能爲任意大小的工作,不像上面的例子中這是由你要多少次複製和粘貼限制的方法。從本質上講,它動態地創建一個函數(使用new Function
),它將返回一個正確大小的函數,然後只是通過代理傳遞給它的任何函數。是的,這確實傷害了你的頭。無論如何,我想我會基準它與上述...
http://jsperf.com/functions-with-custom-length(你也可以看到'邪惡'的代碼)。
邪惡的方法比hacky copypasta方法慢數百倍,所以你去了。因此,當函數聲明它被設置,而不是多變(如果按規格實現)
只是有趣的是,什麼原因讓你甚至想到這個問題? – shabunc
你爲什麼要設置長度?你知道當你實際調用一個函數時,你可以傳遞比「期望」參數更少的參數,或者更多? (如果你傳遞更多的函數可以通過它的'arguments'對象訪問它們。) – nnnnnn
出於興趣,你爲什麼要這樣做? – Russell