对象变量范围javascript?

时间:2013-06-02 20:07:14

标签: javascript object scope

我不明白这个范围是如何运作的。如果eg.i仅在first中进行了修改,那么second的价值如何得到修改?

示例

var obj = {

    first: function() {

        var eg = {i: 0}; // eg equals 0 here

        obj.second(eg);
        obj.second(eg);

        console.log(eg.i); // 2
    },

    second: function(eg) {

        ++eg.i;
    }
};

如何在第一个函数中修改eg.i

3 个答案:

答案 0 :(得分:4)

当对象传递给JS中的函数时,它们作为引用而不是值传递:http://snook.ca/archives/javascript/javascript_pass

答案 1 :(得分:4)

正如我对Ahmed Nuaman的回答所说的那样,说参数通过引用传递是不正确的。证明这是微不足道的:

function change (x) {
    //"replace" x with a different object?
    x = {
        a : 4
    };
}
var o = { a : 6 };
change(o);
console.log(o.a); //6

如果参数确实已通过引用传递,o.a将为4。但是,参数是通过引用传递的 - 在这种情况下,值只是对象。

这就是为什么你观察到问题中出现的症状:当你直接修改参数时,传入的对象被改变了。

就好像你有一些冰淇淋,然后回到展台,要求额外的一勺香草。你仍然有同样的杯子,但有额外的东西。在上面的例子中使用这个类比,你要求一个新的香草冰淇淋:你仍然有旧的冰淇淋,并没有改变(好吧,它可能已经融化了一点)。在传递参考的情况下,你会倾倒现有的冰淇淋,并获得一个全新的冰淇淋。

作为最后一点:这不是关于js中的范围规则。如果eg没有传递给second函数,则它将无法使用。

答案 2 :(得分:2)

您将eg作为参数传递给second。您可能更容易看到是否重命名它:

second: function(x) {
    ++x.i;
}

它在第一个函数中被修改,因为你用第二个函数修改它。