3 回答

TA贡献2021条经验 获得超8个赞
用于.apply()
对arguments
函数进行相同的访问b
,如下所示:
function a(){ b.apply(null, arguments);}function b(){ alert(arguments); //arguments[0] = 1, etc}a(1,2,3);

TA贡献1844条经验 获得超8个赞
传播运营商
spread运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组文字)的位置扩展表达式。
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)
Note 如果您的浏览器仍使用ES5,则此代码段会返回语法错误。
编者注:由于代码片段使用console.log()
,您必须打开浏览器的JS控制台才能看到结果 - 没有页内结果。
它会显示以下结果:
简而言之,如果您使用数组,扩展运算符可以用于不同的目的,因此它也可以用于函数参数,您可以在官方文档中看到类似的示例:Rest参数

TA贡献1784条经验 获得超8个赞
没有任何其他的答案中提供的解释是,原来的参数是仍然可用,但不是在原来的位置arguments
的对象。
所述arguments
对象包含提供给函数每个实际参数的一个元件。当你调用a
你提供三个参数:编号1
,2
和,3
。所以,arguments
包含[1, 2, 3]
。
function a(args){ console.log(arguments) // [1, 2, 3] b(arguments);}
b
但是,当你调用时,你只传递一个参数:a
's arguments
object。所以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
提供set arguments
对象。
以下结果取得了相同的结果:
function a(args){ b(arguments[0], arguments[1], arguments[2]); // three arguments}
但apply
在一般情况下是正确的解决方案。
添加回答
举报