使用参数数组调用函数

时间:2009-12-10 15:49:38

标签: javascript arrays arguments

我可以在JavaScript中以方便的方式调用带有参数数组的函数吗?

示例:

var fn = function() {
    console.log(arguments);
}

var args = [1,2,3];

fn(args);

我需要arguments[1,2,3],就像我的数组一样。

2 个答案:

答案 0 :(得分:31)

您应该使用apply

var fn = function() {
    console.log(arguments);
};

var args = [1,2,3];

fn.apply(null, args);

Apply将进行等效函数调用:

fn(1,2,3);

请注意,我使用null作为apply的第一个参数,将this关键字设置为window内的全局对象(fn

另外你应该知道arguments对象实际上不是一个数组,它是一个类似数组的对象,它包含与用于调用你的函数的参数相对应的数字索引,length提供所用参数数量的属性,以及作为执行函数引用的arguments.callee属性(对匿名函数的递归很有用)。

如果您想从arguments对象制作数组,可以使用Array.prototype.slice方法:

var fn = function() {
  var args = Array.prototype.slice.call(arguments);
  console.log(args);
};

修改:在回复您的评论时,您可以使用shift方法并将其返回值设置为您的函数的上下文(this关键字) :

fn.apply(args.shift(), args);

但请记住,shift将从原始数组中删除第一个元素,并且在没有第一个参数的情况下将调用您的函数。

如果您仍需要使用所有其他参数调用您的函数,您可以:

fn.apply(args[0], args);

如果你不想改变上下文,你可以简单地在你的函数中提取第一个参数:

var fn = function() {
  var args = Array.prototype.slice.call(arguments),
      firstArg = args.shift();

  console.log(args, firstArg);
};

答案 1 :(得分:11)

在ECMAScript 6中,您可以使用spread syntax (...)来实现此目的。它比Function.prototype.apply()更简单易懂。

代码示例:

const fn = function() {
  console.log(arguments);
}

const args = [1,2,3];

fn(...args);