有没有办法覆盖参数'getter / setter性质?

时间:2014-11-10 04:14:58

标签: javascript arguments

正如我刚刚发现的那样:如果使用参数签名定义函数,则使用这些参数名称也将更改使用arguments访问的值。有没有解决的办法。还有其他JavaScript特殊情况吗? 例如:

function fn(a) {
    a = "changed";
    console.log(arguments[0]);//changed
}

fn("initial");

3 个答案:

答案 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'是另一种解决方法。