Javascript参数对象无法按预期工作

时间:2017-05-07 10:05:58

标签: javascript arguments

当我设置arugments[0] = chewie; arguments[1] = luke时,它会打印:

巴卡

巴卡

Han Solo

Chewbacca

我的期望如下:

巴卡

Luke Skywalker

Han Solo

Chewbacca

function starWars(luke, darth, han, chewie) {

   arguments[0] = chewie;
   arguments[1] = luke;

   document.write(arguments[0] + "<br>");
   document.write(arguments[1] + "<br>");
   document.write(arguments[2] + "<br>");
   document.write(arguments[3] + "<br>");
 
} 

starWars("Luke Skywalker", "Darth Vader", "Han Solo", "Chewbacca");

任何人都能详细解释一下为什么它不像我预期的那样工作吗?

3 个答案:

答案 0 :(得分:3)

在宽松模式下,arguments中的条目已链接到指定参数。因此,通过设置arguments[0],您设置luke.从字面上看,行arguments[0] = chewie;luke = chewie;可以互换。因此,稍后当您使用arguments[1]中的luke时,您将使用更新后的值(chewie)。

严格模式删除了这个神奇的链接:

&#13;
&#13;
"use strict";
function starWars(luke, darth, han, chewie) {

   arguments[0] = chewie;
   arguments[1] = luke;

   console.log(arguments[0]);
   console.log(arguments[1]);
   console.log(arguments[2]);
   console.log(arguments[3]);
 
} 

starWars("Luke Skywalker", "Darth Vader", "Han Solo", "Chewbacca");
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您正在使用luke重新分配chewie变量,因为argument[0]参考luke

所以在arguments[0] = chewie之后,会发生什么luke = chewie

解决方法可能是:

var tempLuke = argument[0];
arguments[0] = chewie;
arguments[1] = tempLuke;

答案 2 :(得分:1)

更改arguments对象时,还会更改函数的参数变量,因为它包含对变量的引用。

总结

1)arguments[0] = chewie;

在这里,您还将变量luke设置为chewie(&#39; chewbacca&#39;)

2)参数[1] =卢克;

在这里,卢克已经成了&#39; chewbacca&#39;在第一步。所以,你也在争论dart&#39; chewbacca&#39;。