查看下面的Javascript显示模块模式,变量“ defaultValue”不会更新,需要使用getter来访问和更新值-在here中进行了说明。
那么为什么数组(例如defaultArray)确实可以更新并且可以在没有特定getter的情况下进行访问?
示例代码:
var go = function () {
var defaultValue = null;
var defaultArray = [];
var setDefaultValue = function (newObj) {
for (var i = 0; i < 5; i++) {
if (i == 2) {
defaultValue = newObj;
defaultArray.push(newObj);
}
}
};
var getDefault = function () {
return defaultValue;
};
return {
defaultValue: defaultValue,
setDefaultValue: setDefaultValue,
getDefault: getDefault,
defaultArray: defaultArray,
};
};
window.onload = function () {
var ans = new go();
ans.setDefaultValue({ test: 'ok', unos: 123 })
// At this point, defaultArray has updated, but defaultValue has not
var thisWillBeNull = ans.defaultValue;
var thisWillHaveAValue = ans.defaultArray;
// Can get the value
var newDefault = ans.getDefault();
};
最佳答案
区别在于编辑变量本身与引用的对象之间。
将一个变量或属性分配给另一个变量或属性时,始终会复制该值,并且变量/属性保持彼此独立。
// defaultValue: defaultValue
defaultValue ------\
>--- null
ans.defaultValue --/
// defaultArray: defaultArray
defaultArray ------\
>--- []
ans.defaultArray --/
在
defaultArray
中重新分配给setDefaultValue()
实际上是在更改变量,但对属性没有任何影响。defaultValue ------- { test: 'ok', unos: 123 }
ans.defaultValue --- null
当
.push()
更改Array
实例本身时,变量和属性均保持对Array的引用不变。defaultArray --------\
>--- [
/ 0: { test: 'ok', unos: 123 }
/ ]
ans.defaultArray --/
通过将属性定义为getter和/或setter,它将不再拥有自己的值,并将依赖于变量:
return {
get defaultValue() {
return defaultValue;
},
// ...
};
ans.defaultValue ----> defaultValue ----> null
ans.defaultValue ----> defaultValue ----> { test: 'ok', unos: 123 }
关于javascript - 为什么数组在变量不更新时更新?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26220813/