我尝试过以下方法但没有成功:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
在函数a中,我可以使用arguments关键字来访问参数数组,在函数b中这些参数丢失了。有没有办法将参数传递给另一个javascript函数,就像我尝试做的那样?
答案 0 :(得分:512)
使用.apply()
与arguments
功能b
具有相同的访问权限,如下所示:
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
答案 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控制台才能看到结果 - 将会有否页面结果。
它将显示以下结果:
简而言之,如果您使用数组,扩展运算符可以用于不同的目的,因此它也可以用于函数参数,您可以看到官方文档中解释的类似示例: {{3 }} 强>
答案 2 :(得分:75)
其他答案都没有提供的解释是原始参数 仍然可用,但不在arguments
对象的原始位置。
arguments
对象包含为函数提供的每个实际参数的一个元素。当您致电a
时,您会提供三个参数:数字1
,2
和3
。因此,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)
}
obj
和method
由bar()
方法使用,而其余的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