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