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


386

我已经尝试了以下方法,但均未成功:

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

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

a(1,2,3);

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


3
@ BobStein-VisiBone同意。另外,请注意,arguments实际上不是数组(而是一个实现类似数组的语义对象),因此乍一看尚不清楚它是否可以与实际数组相同的方式使用。
Jules

这些年来, @ Jules仍然投票决定重新开放。烧毁他人的宝贵工作的徽章是什么?有很多可以去的东西。
Bob Stein

Answers:


542

用于.apply()argumentsin函数具有相同的访问权b,如下所示:

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

您可以在这里进行测试


21
@Brett-您可以将其复制到数组中,然后在传递之前进行操作,例如:var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
Nick Craver

18
但是apply像这样使用可能会破坏范围b(例如,如果它是对象的某些内部功能)
vsync

3
@vsync很好,但是问题很容易解决:将对象作为应用的第一个参数传递。
塔德·里斯皮

11
一起使用“ args”和“ arguments”是没有意义的
dude 2015年

3
但是随后,“ this”可能会更改为b的原始this以外的其他内容。
trusktr

223

点差运算符

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

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

不使用该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)

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

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

它将显示以下结果:

Spread运算符参数示例的图像

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


6
这是一个非常好的运算符,我非常期待使用它。但是,它不会发生。目前,唯一已经支持传播运算符的浏览器是FF。请参阅兼容性表以获取完整的最新数据:kangax.github.io/compat-table/es6/#spread_%28...%29_operator
TMG

10
为什么不使用它?使用babel进行转换相对容易,您可以获得所有新功能,并且与旧版浏览器的兼容性更高。
adgelbfish

这比第一个解决方案要好,因为它可以在使用箭头运算符定义的函数中工作。
sarfata

您不需要...argsa功能。你可以只是做一个函数不带任何参数,并把它们交给b...arguments
cronoklee

1
对于阅读此答案的任何人:与@cronoklee的评论相反,如果您具有嵌套函数,则显式指定...argsa的输入可能很重要。
Arshia001,19年

81

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

arguments对于提供给函数的每个实际参数,该对象包含一个元素。当你调用a你提供三个参数:编号12和,3。因此,arguments包含[1, 2, 3]

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

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

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

a(1,2,3);

正如@Nick演示的那样,您可以用来在调用中apply提供一个设置arguments对象。

以下实现相同的结果:

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

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


如果你总是传递thisapply
Flimm

1
@Flimm-是的,因为参数是第二个参数,所以第一个参数必须有某些内容(可以为null)。
RobG

0

尝试这个

function global_func(...args){
  for(let i of args){
    console.log(i)
  }
}


global_func('task_name', 'action', [{x: 'x'},{x: 'x'}], {x: 'x'}, ['x1','x2'], 1, null, undefined, false, true)




//task_name
//action
//(2) [{...},
//    {...}]
//    {
//        x:"x"
//    }
//(2) [
//        "x1",
//        "x2"
//    ]
//1
//null
//undefined
//false
//true
//func
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.