问题 JavaScript:为什么更改参数变量会更改`arguments`“数组”?


考虑:

> function hello(what) {
.     what = "world";
.     return "Hello, " + arguments[0] + "!";
. }
> hello("shazow")
"Hello, world!"

为什么改变价值 what 改变的价值 arguments[0]


5516
2018-04-19 02:50


起源



答案:


“为什么改变价值 what 改变的价值 arguments[0]?”

因为这就是它的设计工作方式。形式参数直接映射到arguments对象的索引。

那是 除非 你在 严格的模式,您的环境支持它。然后更新一个不会影响另一个。

function hello(what) {
    "use strict"; // <-- run the code in strict mode
    what = "world";
    return "Hello, " + arguments[0] + "!";
}
hello("shazow"); // "Hello, shazow!"

12



哦......在那种情况下:为什么它的设计是这样的?这个设计是否记录在任何地方? (不是我不相信你,当然,我只是想要更多细节) - David Wolever
哦,等等,我们走了:“注1” 10.6参数对象 的 ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - David Wolever
@DavidWolever:语言是ECMAScript规范中的文档。 ECMAScript 5中引入了严格模式。
@ DavidWolever-为方便起见,有一个 ES5的HTML版本 在github上。 - RobG
读数比官方规格要轻一些: developer.mozilla.org/en/JavaScript/Reference/... - jfriend00


答案:


“为什么改变价值 what 改变的价值 arguments[0]?”

因为这就是它的设计工作方式。形式参数直接映射到arguments对象的索引。

那是 除非 你在 严格的模式,您的环境支持它。然后更新一个不会影响另一个。

function hello(what) {
    "use strict"; // <-- run the code in strict mode
    what = "world";
    return "Hello, " + arguments[0] + "!";
}
hello("shazow"); // "Hello, shazow!"

12



哦......在那种情况下:为什么它的设计是这样的?这个设计是否记录在任何地方? (不是我不相信你,当然,我只是想要更多细节) - David Wolever
哦,等等,我们走了:“注1” 10.6参数对象 的 ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - David Wolever
@DavidWolever:语言是ECMAScript规范中的文档。 ECMAScript 5中引入了严格模式。
@ DavidWolever-为方便起见,有一个 ES5的HTML版本 在github上。 - RobG
读数比官方规格要轻一些: developer.mozilla.org/en/JavaScript/Reference/... - jfriend00