将parameter passing给另一个JavaScript函数
我试过以下没有成功:
function a(args){ b(arguments); } function b(args){ // arguments are lost? } a(1,2,3);
在函数a中,我可以使用参数关键字来访问一个参数数组,在函数b中这些都是丢失的。 有没有办法将parameter passing给另一个JavaScript函数,就像我试图做的一样?
使用.apply()
对函数b
arguments
进行相同的访问,如下所示:
function a(args){ b.apply(this, arguments); } function b(args){ alert(arguments); //arguments[0] = 1, etc } a(1,2,3);
你可以在这里testing一下 。
传播运营商
扩展运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组文字)的地方扩展expression式。
ECMAScript ES6添加了一个新的运算符,可以让您以更实用的方式执行此操作 : … Spread运算符 。
不使用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)
其他答案都不提供的解释是,原始参数仍然可用,但不在arguments
对象的原始位置。
arguments
对象包含提供给函数的每个实际参数的一个元素。 当你打电话a
你提供三个参数:数字1
和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
是正确的解决scheme。