我可以在JavaScript中以方便的方式调用带有参数数组的函数吗?
示例:
var fn = function() {
console.log(arguments);
}
var args = [1,2,3];
fn(args);
我需要arguments
为[1,2,3]
,就像我的数组一样。
答案 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);