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

时间:2010-10-12 12:18:16

标签: javascript

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

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

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

a(1,2,3);

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

5 个答案:

答案 0 :(得分:512)

使用.apply()arguments功能b具有相同的访问权限,如下所示:

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

You can test it out here

答案 1 :(得分:182)

传播运营商

  

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

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)

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

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

它将显示以下结果:

Image of Spread operator arguments example

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

答案 2 :(得分:75)

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

arguments对象包含为函数提供的每个实际参数的一个元素。当您致电a时,您会提供三个参数:数字123。因此,arguments包含[1, 2, 3]

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

但是,当您致电b时,您会准确传递一个参数:a的{​​{1}}个对象。因此arguments包含arguments(即一个元素,即[[1, 2, 3]]的{​​{1}}对象,其属性包含a的原始参数。)

arguments

正如@Nick演示的那样,您可以使用a在通话中提供设置function b(args){ // arguments are lost? console.log(arguments) // [[1, 2, 3]] } a(1,2,3); 对象。

以下结果相同:

apply

arguments是一般情况下的正确解决方案。

答案 3 :(得分:1)

如果只想传递某些参数,可以这样:

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

Foo.js

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

objmethodbar()方法使用,而其余的args传递给实际的调用。

答案 4 :(得分: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