揭示模块模式和范围

时间:2014-04-02 14:08:28

标签: javascript scope revealing-module-pattern

我遇到了一些我正在运行的javascript问题并将其分解为下面的代码。我很困惑为什么_localVar变量在调用init()后没有变化。我发现如果我在揭示模块中引用this._localVar,结果就像预期的那样。我对范围感到困惑。有人可以澄清为什么会这样。我想如果我没有使用this,那么下一个范围将是模块,但我不认为这种情况正在发生。

var myRevealingModule = (function () {
    var _localVar = "Default";

    function init() {
        console.log(_localVar);
        _localVar = "Init";
    }

    function getTest() {
        console.log(_localVar);
    }

    return {
        init: init,
        getTest: getTest,
        localVar: _localVar
    };
})();

myRevealingModule.getTest();               // "Default"
console.log(myRevealingModule.localVar);   // "Default"
myRevealingModule.init();                  // "Default"
myRevealingModule.getTest();               // "Init"
console.log(myRevealingModule.localVar);   // "Default"   * WHY *

2 个答案:

答案 0 :(得分:1)

myRevealingModule.localVar不是对变量值的引用;它只是在创建字符串时复制它。

当您使用this.localVar时,您正在使用返回对象中的变量。因此,当您更改该标识符时,它也会更新为myRevealingModule.localVar

答案 1 :(得分:1)

请注意,您的模块使用自调用功能。因此,myRevealingModule.localVar的值在myRevealingModule的定义和内置调用之后立即确定。此时_localVar的值为"默认",将其复制到返回的对象的localVar属性。即使您之后更改_localVar,这对myRevealingModule.localVar也不会有任何影响。

基本上,以下示例显示了相同的效果:

var a = 42;
var b = a;
console.log(a); // 42
console.log(b); // 42
a = 84;
console.log(a); // 84
console.log(b); // 42

b复制a的值。如果您之后更改a,则对b无影响。