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

And*_*ard 355 javascript

我试过以下但没有成功:

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

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

a(1,2,3);
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ver 522

用于.apply()arguments函数进行相同的访问b,如下所示:

function a(){
    b.apply(null, arguments);
}
function b(){
   alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);?
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试一下.

  • @Brett - 您可以将其复制到数组中,然后在传递之前对其进行操作,例如:`var copy = [] .slice.call(arguments); <删除你想要的东西> myFunc.apply(this,copy);` (21认同)
  • 但是像这样使用`apply`可能会搞砸`b`的范围(例如,如果它是某个对象的内部函数) (18认同)
  • 将"args"和"arguments"一起使用是没有意义的...... (11认同)
  • @vsync很好,但问题很容易解决:将对象作为第一个参数传递给apply. (3认同)
  • 但是之后"这个"可能会变成除了b原创之外的东西. (3认同)

Wal*_*anG 197

传播运营商

spread运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组文字)的位置扩展表达式.

ECMAScript ES6添加了一个新的运算符,允许您以更实际的方式执行此操作:... Spread运算符.

不使用该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)
Run Code Online (Sandbox Code Playgroud)

Note 如果您的浏览器仍使用ES5,则此代码段会返回语法错误.

编者注:由于代码片段使用console.log(),您必须打开浏览器的JS控制台才能看到结果 - 没有页内结果.

它会显示以下结果:

Spread运算符参数示例的图像

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

  • 为什么不应该使用它?使用babel进行转换相对容易,您可以获得所有新功能,并且与旧版浏览器的兼容性更高. (8认同)
  • 这是一个非常好的操作员,我真的很期待使用它.但是,它还没有发生.目前唯一支持扩展运算符的浏览器是FF.有关完整的最新数据,请参阅兼容性表:http://kangax.github.io/compat-table/es6/#spread_%28 ....%29_operator (6认同)

Way*_*ett 78

,没有任何其他的答案中提供的解释是,原来的参数仍然可用,但不是在原来的位置arguments的对象.

所述arguments对象包含提供给函数每个实际参数的一个元件.当你调用a你提供三个参数:编号1,2和,3.所以,arguments包含[1, 2, 3].

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

b但是,当你调用时,你只传递一个参数:a's argumentsobject.所以arguments包含[[1, 2, 3]](即一个元素,它是具有包含原始参数的属性aarguments对象a).

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

a(1,2,3);
Run Code Online (Sandbox Code Playgroud)

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

以下结果取得了相同的结果:

function a(args){
    b(arguments[0], arguments[1], arguments[2]); // three arguments
}
Run Code Online (Sandbox Code Playgroud)

apply在一般情况下是正确的解决方案.