将参数作为不带.apply()的数组传递

Passing arguments as an array without .apply()

本文关键字:数组 apply 参数      更新时间:2023-09-26

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

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

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

我在想,我可能可以设置这样的函数参数对象:

function.arguments = otherArguments;

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

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

不,没有办法。一个工具代表一个功能,可供选择的工具是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);
}

我根本不建议这样做,但如果你想疯了,你可能会为你正在调用的函数的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个可选参数。

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

仅举一例:

如果使用setTimeout,则可以传递params:

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

通过这种方式,参数被传递到函数,而不使用apply