正如我刚刚发现的那样:如果使用参数签名定义函数,则使用这些参数名称也将更改使用arguments
访问的值。有没有解决的办法。还有其他JavaScript特殊情况吗?
例如:
function fn(a) {
a = "changed";
console.log(arguments[0]);//changed
}
fn("initial");
答案 0 :(得分:1)
您可以在函数开头复制arguments
对象,然后复制将无法为命名参数指定新值。
或者,如果将该函数置于strict
模式,则参数对象不再被命名参数别名,因此如果将某些内容分配给命名参数,它将不会更改。您可以在严格模式下查看有关arguments
对象的评论on this MDN page以获取更多信息。
答案 1 :(得分:0)
这是老一代javascript引擎带来的一个怪癖,不会破坏向后兼容性,你可以"use strict";避免这样的事情以及许多其他事情。如果您有一个“增长的”代码库,您可能只想在特定的功能范围内应用“use strict”以避免破坏您的应用程序,尽管更好的方法是将所有代码更新为严格模式兼容。
有关“use strict”语句禁用的古怪行为的完整列表,请参阅changes in strict mode列表。
(function () {
"use strict";
function fn(a) {
a = "changed";
console.log(arguments[0]);//initial
}
fn("initial");
})();
答案 2 :(得分:0)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments
arguments
是函数的局部变量,类似于数组。它包含传递给函数的每个参数的条目。如果您更改了值,则其中一个参数arguments
也将具有更新的值。
您可以在进行更改之前将参数复制到数组中:
function fn(a) {
var originalArgumentValues = Array.prototype.slice.call(arguments);
a = "changed";
console.log(arguments[0]);//changed
console.log(originalArgumentValues[0]);//inital
};
fn("initial");
正如其他人发布的那样,'use strict'
是另一种解决方法。