我尝试了以下方法但没有成功:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
在函数a中,我可以使用arguments关键字来访问参数数组,在函数b中这些都丢失了。有没有办法像我尝试做的那样将参数传递给另一个 javascript 函数?
我尝试了以下方法但没有成功:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
在函数a中,我可以使用arguments关键字来访问参数数组,在函数b中这些都丢失了。有没有办法像我尝试做的那样将参数传递给另一个 javascript 函数?
用于.apply()
对arguments
in 函数具有相同的访问权限b
,如下所示:
console.log = function(x) { document.write(x === undefined ? undefined : JSON.stringify(x) + "<br />"); };
function a(){
b.apply(null, arguments);
}
function b(){
console.log(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
展开运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组文字)的地方扩展表达式。
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控制台看到的结果-将有没有在页面结果。
它会显示这个结果:
简而言之,如果您使用数组,则扩展运算符可以用于不同的目的,因此它也可以用于函数参数,您可以在官方文档中看到类似的示例:Rest parameters
的解释,没有任何其他的答案用品的是,原来的参数是仍然可用,但不是在原来的位置arguments
的对象。
arguments
对于提供给函数的每个实际参数,对象包含一个元素。当您打电话时,您需要a
提供三个参数:数字1
、2
、 和3
。所以,arguments
包含[1, 2, 3]
.
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
b
但是,当您调用时,您只传递了一个参数:a
的arguments
对象。所以arguments
包含[[1, 2, 3]]
(即一个元素,它是a
的arguments
对象,它的属性包含到 的原始参数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
在一般情况下是正确的解决方案。
如果你只想传递某些参数,你可以这样做:
Foo.bar(TheClass, 'theMethod', 'arg1', 'arg2')
Foo.js
bar (obj, method, ...args) {
obj[method](...args)
}
obj
和method
由bar()
方法使用,而其余的参数则传递给实际调用。