查看下面的 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 --/
在 setDefaultValue()
中对 defaultArray
的重新分配实际上是在改变变量,但对属性没有任何影响。
defaultValue ------- { test: 'ok', unos: 123 }
ans.defaultValue --- null
虽然 .push()
正在改变 Array
实例本身,但变量和属性都保持不变,因为持有对 Array 的引用。
defaultArray --------\
>--- [
/ 0: { test: 'ok', unos: 123 }
/ ]
ans.defaultArray --/
通过将属性定义为 getter和/或 setter ,它将不再拥有自己的值(value)并将依赖于变量:
return {
get defaultValue() {
return defaultValue;
},
// ...
};
ans.defaultValue ----> defaultValue ----> null
ans.defaultValue ----> defaultValue ----> { test: 'ok', unos: 123 }
关于javascript - 为什么数组更新而变量不更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220813/