现在,这是我能想到的最佳解决方案。
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