将参数传递给另一个javascript函数

Passing arguments forward to another javascript function

本问题已经有最佳答案,请猛点这里访问。

我尝试过以下方法但没有成功:

1
2
3
4
5
6
7
8
9
function a(args){
    b(arguments);
}

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

a(1,2,3);

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


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

1
2
3
4
5
6
7
function a(){
    b.apply(null, arguments);
}
function b(){
   alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);?

你可以在这里测试一下。


推广算子

The spread operator allows an expression to be expanded in places where multiple arguments (for function calls) or multiple elements (for array literals) are expected.

ECMAScript ES6添加了一个新的运算符,使您能够以更实际的方式执行此操作:…Spread运算符。

不使用apply方法的示例:

1
2
3
4
5
6
7
8
9
function a(...args){
  b(...args);
  b(6, ...args, 8) // You can even add more elements
}
function b(){
  console.log(arguments)
}

a(1, 2, 3)

note如果您的浏览器仍然使用ES5,则此代码段返回语法错误。

编者按:由于代码段使用console.log(),所以必须打开浏览器的JS控制台才能看到结果-页面中不会有结果。

它将显示此结果:

Image of Spread operator arguments example

简而言之,如果使用数组,spread运算符可以用于不同的目的,因此它也可以用于函数参数,您可以在正式文档中看到类似的示例:rest参数


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

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

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

但是,当您调用b时,您只传递了一个参数:aarguments对象。因此,arguments包含[[1, 2, 3]](即一个元素,即aarguments对象,其属性包含a的原始参数)。

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

a(1,2,3);

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

以下结果相同:

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

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