var namepace = (function () {

    var loca = 5;

    var getLocal = function () {
        loca += 1;
        return loca;
    };

    return {
        glob: getLocal,
        blog: loca,
        frog: function () {
            return loca;
        }
    };
})();

alert(namepace.glob());
alert(namepace.blog);
alert(namepace.frog());

我的问题是为什么函数alert(namepace.blog);返回5而不是我期望的6

最佳答案

这里要了解的重要一点是,JavaScript中的所有名称都是对其他对象的引用。

使用Object文字创建Object时,左侧名称用于引用右侧名称已引用的对象。

在这种情况下,当您执行

    blog: loca,

您说的是blog引用的是loca所引用的值,即5。稍后,当您增加loca时,它变为6,这意味着它引用了其他值,但是blog仍然引用了5值。

这就是为什么您得到5的原因。

但是当你这样做
namepace.frog()

您将获得loca引用的当前值。由于已在6中为其分配了getLocal,因此您将获得6

增量创建新的数字对象

更清楚地说,当您这样做时
loca += 1;

或者
loca++;

内部发生的事情是这样的
oldValue = loca
newValue = oldValue + 1
loca = newValue

ECMAScript 5.1规范的引用,适用于 += ++

由于数字是不可变的对象(您可以更改5的值吗?您不能更改它的值,所以不能将其称为不可变对象(immutable对象)),因此将创建一个新的数字对象,并添加一个数字对象,并使用名称loca来引用该新对象。 。

可变对象

如果您考虑可变对象,
var namepace = (function () {

    var loca = [];

    return {
        glob: function () {
            loca.push(1);
            return loca;
        },
        blog: loca,
        frog: function () {
            return loca;
        }
    };
})();

console.log(namepace.glob());
// [ 1 ]
console.log(namepace.blog);
// [ 1 ]
console.log(namepace.frog());
// [ 1 ]

现在,blogloca都引用相同的数组对象。 glob中发生的事情称为变异。您只是将一个元素添加到使用两个名称blogloca引用的数组对象中。这就是namepace.blog也打印[ 1 ]的原因。

10-02 14:40