This question already has an answer here:
这个问题已经有了答案:
- Passing an array as a function parameter in JavaScript 7 answers
- 在JavaScript 7中将数组作为函数参数传递
I've tried the following with no success:
我试过以下方法,但没有成功:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
In function a, I can use the arguments keyword to access an array of arguments, in function b these are lost. Is there a way of passing arguments to another javascript function like I try to do?
在函数a中,我可以使用arguments关键字来访问一个参数数组,在函数b中这些参数都丢失了。是否有一种方法可以像我尝试的那样将参数传递给另一个javascript函数?
3 个解决方案
#1
475
Use .apply()
to have the same access to arguments
in function b
, like this:
使用.apply()对函数b中的参数具有相同的访问权限,如下所示:
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
你可以在这里测试一下。
#2
136
Spread operator
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 added a new operator that lets you do this in a more practical way: ...Spread Operator.
ECMAScript ES6添加了一个新的操作符,让您以更实际的方式进行操作:…传播算子。
Example without using the apply
method:
不使用应用方法的示例:
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 This snippet returns a syntax error if your browser still uses ES5.
注意,如果您的浏览器仍然使用ES5,则此代码段返回一个语法错误。
Editor's note: Since the snippet uses console.log()
, you must open your browser's JS console to see the result - there will be no in-page result.
编辑器注意:由于这个代码片段使用了console.log(),所以您必须打开浏览器的JS控制台以查看结果——不会出现页面内的结果。
It will display this result:
它将显示以下结果:
In short, the spread operator can be used for different purposes if you're using arrays, so it can also be used for function arguments, you can see a similar example explained in the official docs: Rest parameters
简而言之,如果您使用数组,那么扩展操作符可以用于不同的目的,因此它也可以用于函数参数,您可以在官方文档中看到类似的示例:Rest参数
#3
71
The explanation that none of the other answers supplies is that the original arguments are still available, but not in the original position in the arguments
object.
没有其他答案提供的解释是原始参数仍然可用,但不在arguments对象的原始位置。
The arguments
object contains one element for each actual parameter provided to the function. When you call a
you supply three arguments: the numbers 1
, 2
, and, 3
. So, arguments
contains [1, 2, 3]
.
parameters对象包含为函数提供的每个实际参数的一个元素。当你调用a时,你提供了三个参数:1、2和3。因此,参数包含[1,2,3]。
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
When you call b
, however, you pass exactly one argument: a
's arguments
object. So arguments
contains [[1, 2, 3]]
(i.e. one element, which is a
's arguments
object, which has properties containing the original arguments to a
).
当你调用b时,你只传递一个参数:a的参数对象。因此,参数包含[[1,2,3]](即一个元素,它是一个参数对象,它具有包含原始参数的属性)。
function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}
a(1,2,3);
As @Nick demonstrated, you can use apply
to provide a set arguments
object in the call.
如@Nick所示,您可以使用apply在调用中提供set arguments对象。
The following achieves the same result:
以下是相同的结果:
function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}
But apply
is the correct solution in the general case.
但在一般情况下,应用是正确的解决方案。
#1
475
Use .apply()
to have the same access to arguments
in function b
, like this:
使用.apply()对函数b中的参数具有相同的访问权限,如下所示:
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
你可以在这里测试一下。
#2
136
Spread operator
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 added a new operator that lets you do this in a more practical way: ...Spread Operator.
ECMAScript ES6添加了一个新的操作符,让您以更实际的方式进行操作:…传播算子。
Example without using the apply
method:
不使用应用方法的示例:
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 This snippet returns a syntax error if your browser still uses ES5.
注意,如果您的浏览器仍然使用ES5,则此代码段返回一个语法错误。
Editor's note: Since the snippet uses console.log()
, you must open your browser's JS console to see the result - there will be no in-page result.
编辑器注意:由于这个代码片段使用了console.log(),所以您必须打开浏览器的JS控制台以查看结果——不会出现页面内的结果。
It will display this result:
它将显示以下结果:
In short, the spread operator can be used for different purposes if you're using arrays, so it can also be used for function arguments, you can see a similar example explained in the official docs: Rest parameters
简而言之,如果您使用数组,那么扩展操作符可以用于不同的目的,因此它也可以用于函数参数,您可以在官方文档中看到类似的示例:Rest参数
#3
71
The explanation that none of the other answers supplies is that the original arguments are still available, but not in the original position in the arguments
object.
没有其他答案提供的解释是原始参数仍然可用,但不在arguments对象的原始位置。
The arguments
object contains one element for each actual parameter provided to the function. When you call a
you supply three arguments: the numbers 1
, 2
, and, 3
. So, arguments
contains [1, 2, 3]
.
parameters对象包含为函数提供的每个实际参数的一个元素。当你调用a时,你提供了三个参数:1、2和3。因此,参数包含[1,2,3]。
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
When you call b
, however, you pass exactly one argument: a
's arguments
object. So arguments
contains [[1, 2, 3]]
(i.e. one element, which is a
's arguments
object, which has properties containing the original arguments to a
).
当你调用b时,你只传递一个参数:a的参数对象。因此,参数包含[[1,2,3]](即一个元素,它是一个参数对象,它具有包含原始参数的属性)。
function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}
a(1,2,3);
As @Nick demonstrated, you can use apply
to provide a set arguments
object in the call.
如@Nick所示,您可以使用apply在调用中提供set arguments对象。
The following achieves the same result:
以下是相同的结果:
function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}
But apply
is the correct solution in the general case.
但在一般情况下,应用是正确的解决方案。