将参数作为数组传递而不使用.apply()

时间:2012-08-29 19:17:41

标签: javascript

我试图找出是否有办法将参数作为数组传递给javascript函数,而不使用.apply方法。从用户的角度来看,代码看起来像这样:

var args = [1, 2, 3, 4];
doSomething(args);

请注意,doSomething()并不总是相同的函数,所以我不能写它来使用参数数组。理想情况下,这应该适用于任何函数,我想我想要做的实际上是将数组转换为类似于参数数组的对象。

我在想我可以像这样设置函数arguments对象:

function.arguments = otherArguments;

但是我不知道何时我必须这样做(一旦函数开始执行但在它实际上对其参数做了什么之前,我不会以某种方式做到这一点吗?)< / p>

我尝试这样做的原因是因为我正在尝试编写自己的.apply函数用于学习目的。这可能吗?

3 个答案:

答案 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