javascript - 显示模块模式没有设置我的私有(private)变量,为什么?

标签 javascript scope

function stapler() {

    var color = "black";

    function setColor(newColor) {
        console.log(color); //2. - black
        color = newColor;
        console.log(color); //3. - brown
    }

    function displayColor() {
        console.log(color);
    }

    return {
        c: color,

        set: setColor,

        display: displayColor
    }
}

thing = stapler();

console.log(thing.c); //1. - black
thing.set('brown');
console.log(thing.c); //4. - black, why doesn't this print brown?

从上面可以看出,thing.c(最后一行)返回的是黑色,但为什么不是棕色呢?为什么更改没有保存?我错过了什么?

编辑:

参见http://repl.it/7gs获取以下代码的工作副本。

function stapler() {

    var color = "black";

    function setColor(newColor) {
        console.log(color); //2. - black
        color = newColor;
        console.log(color); //3. - brown
    }

    function getColor() {
        return color;
    }

    return {
        get: getColor(),

        set: setColor,
    }

}

thing = stapler();

console.log(thing.get); //1. - black
thing.set('brown');
console.log(thing.get); //4. - black, why isn't this brown?

最后,让这个问题变得更加复杂......看看下面的例子 -

(可在http://replit.com/7hD查看)

function stapler() {

    var color = "black";

    function setColor(newColor) {
        console.log(color); //2. - black, 6. - brown, why now has it changed?
        color = newColor;
        console.log(color); //3. - brown, 7. - purple
    }

    function getColor() {
        return color;
    }

    return {
        get: getColor(),

        set2: function(newColor) {
            setColor(newColor);
        },

        set: setColor,
    }

}

thing = stapler();

console.log(thing.get); //1. - black
thing.set('brown');
console.log(thing.get); //4. - black, why isn't this brown?
console.log(thing.get); //5. - black, why isn't this brown

console.log('-----');

thing.set2('purple');
console.log(thing.get); //8. - black

这是怎么回事?

最佳答案

您需要添加一个 getter - return {c:color/*...*/ 第一次将颜色的副本放入该变量中,但它没有直接链接到内存。对私有(private) color 变量的任何更改都不会链接到 c 元素(这实际上很好 - 如果它以这种方式工作,您可以使用 从外部更改颜色thing.c='magenta';) 相反,您需要:

function getColor() {return color; }
/*...*/
return { get: getColor, set: setColor, display: displayColor };

关于javascript - 显示模块模式没有设置我的私有(private)变量,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27865013/

相关文章:

python - 将函数变量从一个 python 文件导入到另一个文件

powershell - 纠缠:无法访问父作用域变量

javascript - Lawnchair javascript 数据 "get"不允许我分配给另一个变量

php - 访问后出现 undefined variable /空属性错误

javascript - 您如何将客户链接到 Stripe 结账上的订阅?

javascript - 将变量作为 JQuery CSS 选择器传递不起作用

javascript - Jquery 和 Foundation 4 Accordion 深度链接

javascript - 将utf8内容 append 到html中

javascript - 将规则添加到 CSS 类,然后保存样式表

c++ - 文件作用域和全局作用域的区别