javascript - 为什么数组更新而变量不更新?

标签 javascript revealing-module-pattern

查看下面的 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/

相关文章:

javascript - 处理 null JSON 对象

javascript - 使用 KendoUI 的堆积图

javascript - 如何模拟长文档加载?

javascript - 无法连接到 Service Worker 内的 WebSocket

javascript - 为什么 this.set 在 Kendo 中的这个 Javascript 函数中不起作用

JavaScript 揭示模块模式私有(private)变量状态

javascript - 使用 jQuery 确定 'Revealing Module Pattern' 模块的范围

javascript - 为什么我们在揭示模块模式中使用自执行函数?

javascript - 使用 RequireJS 在 JavaScript 中实现 AMD

javascript - 如何在几天之间获得 Elasticsearch