1

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

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

请注意,这doSomething()并不总是相同的函数,因此我不能将其编写为使用参数数组。理想情况下,这应该适用于任何函数,我想我要做的基本上是将数组转换为类似参数数组的对象。

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

function.arguments = otherArguments;

但我不知道我什么时候必须这样做(一旦函数开始执行但在它实际对其参数做任何事情之前,我是否必须以某种方式这样做?)

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

4

3 回答 3

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);
}
于 2012-08-29T19:30:49.613 回答
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`

请参阅此处,例如,最多支持 12 个可选参数。

但这条路可能会导致疯狂......

于 2012-08-29T20:08:31.100 回答
0

顺便提一下:

如果你使用 setTimeout 你可以传递参数:

    setTimeout( _function_name_, delay, param1,param2,param3...)

这样,参数被传递给函数而不使用 apply

于 2013-03-13T23:31:27.390 回答