将参数转发给另一个javascript函数

我尝试了以下方法,但都没有成功:

function a(args){
b(arguments);
}


function b(args){
// arguments are lost?
}


a(1,2,3);

在函数a中,我可以使用arguments关键字来访问一个参数数组,在函数b中,这些都丢失了。是否有一种方法可以将参数传递给另一个javascript函数,就像我尝试做的那样?

229586 次浏览

使用.apply()在函数b中对arguments具有相同的访问权限,如下所示:

function a(){
b.apply(null, arguments);
}
function b(){
console.log(arguments); //arguments[0] = 1, etc
}
a(1,2,3);

你可以在这里进行测试

其他答案都没有提供的解释是,原始参数仍然可用,但不在arguments对象的原始位置。

arguments对象为提供给函数的每个实际形参包含一个元素。调用a时,需要提供三个参数:数字123。因此,arguments包含[1, 2, 3]

function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}

然而,当你调用b时,你正好传递了一个参数:aarguments对象。所以arguments包含[[1, 2, 3]](即一个元素,它是aarguments对象,其属性包含a的原始参数)。

function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}


a(1,2,3);

正如@Nick演示的那样,你可以使用apply在调用中提供一个set arguments对象。

以下方法可以达到相同的效果:

function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}

但在一般情况下,apply是正确的解决方案。

传播算子

展开运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组字面量)的地方展开表达式。

ECMAScript ES6增加了一个新的操作符,让你以更实际的方式做到这一点:...扩展运算符

不使用apply方法的示例:

function a(...args){
b(...args);
b(6, ...args, 8) // You can even add more elements
}
function b(){
console.log(arguments)
}


a(1, 2, 3)

请注意如果你的浏览器仍然使用ES5,这个代码段将返回一个语法错误。

编者注:由于代码片段使用了console.log(),你必须打开浏览器的JS控制台来查看结果 -页面结果将是no

它将显示如下结果:

Image of Spread operator arguments example

简而言之,如果你使用数组,展开运算符可以用于不同的目的,所以它也可以用于函数参数,你可以在官方文档中看到一个类似的例子:休息参数

如果你只想传递特定的参数,你可以这样做:

Foo.bar(TheClass, 'theMethod', 'arg1', 'arg2')

Foo.js

bar (obj, method, ...args) {
obj[method](...args)
}

objmethodbar()方法使用,而其余参数则传递给实际调用。

这个方法非常有效。

function a(){
b(...arguments);
}


function b(){
for(var i=0;i<arguments.length;i++){
//you can use arguments[i] here.
}
}


a(1,2,3);