我试图找出是否有办法将参数作为数组传递给javascript函数,而不使用.apply方法。从用户的角度来看,代码看起来像这样:
var args = [1, 2, 3, 4];
doSomething(args);
请注意,doSomething()
并不总是相同的函数,所以我不能写它来使用参数数组。理想情况下,这应该适用于任何函数,我想我想要做的实际上是将数组转换为类似于参数数组的对象。
我在想我可以像这样设置函数arguments对象:
function.arguments = otherArguments;
但是我不知道何时我必须这样做(一旦函数开始执行但在它实际上对其参数做了什么之前,我不会以某种方式做到这一点吗?)< / p>
我尝试这样做的原因是因为我正在尝试编写自己的.apply函数用于学习目的。这可能吗?
答案 0 :(得分:1)
不,没有办法解决。一个功能的一个工具,选择的工具是apply
。
如果您需要编写自己不使用apply
的函数,则需要使用eval:
function apply(fn, thisObj, args) {
var obj = {fn: fn};
var str = "obj.fn(";
for (var i=0; i<args.length; i++)
str += (i?',':'') + "args["+i+"]";
str += ");";
return eval(str);
}
答案 1 :(得分:1)
我根本不推荐这个,但如果你想疯了,你可以为你正在调用的函数的arity动态生成一个curry方法,然后在循环中调用生成的curry:
function func(a,b,c,d) {
console.log([a,b,c,d]);
return "Return Value";
}
// Using a static 4 argument curry.
function curry4(f) {
return function(a) {
return function(b) {
return function(c) {
return function(d) {
return f(a,b,c,d);
}
}
}
}
}
var args = [1,2,3,4];
for(var i=0,f=curry4(func);i<func.length;i++) { f = f(args[i]); }
console.log(f); // f is return value of `func`
请参阅here,例如支持最多12个可选参数。
但这条路可能会导致疯狂......
答案 2 :(得分:0)
提到:
如果使用setTimeout,则可以传递params:
setTimeout( _function_name_, delay, param1,param2,param3...)
这样,params被传递给函数而不使用apply