javascript - 模块中的变量范围

标签 javascript

我正在编写我的第一个 javascript 模块,我对范围变量有些不理解。这是我的模块:

var Module = (function () {

    var myString ='a';

    var changeString = function () {
        myString ='b';
        console.log(myString);
    };

    return {
      changeString: changeString,
      myString:myString
    };

  })();

现在如果我这样做:

Module.myString;             // returns 'a'
Module.changeString();       // returns 'b'
Module.myString;             // returns 'a'

对我来说,最后一个命令应该返回“b”,因为我已经用 changeString 方法更改了 myString。我不明白为什么,因为 myString 是在 changeString 方法之外声明的,所以范围似乎没问​​题。我想了解为什么它会这样,以及如何创建一个覆盖变量值的方法。 提前致谢。

最佳答案

这会在创建对象时复制 myString:

return {
  changeString: changeString,
  myString:myString
}

您可以使用 getter 动态返回局部变量,这将为您提供预期的行为:

return {
  changeString: changeString,
  get myString() { 
    return myString;
  }
}

完整示例:

var Module = (function () {

    var myString ='a';

    var changeString = function () {
        myString ='b';
        console.log(myString);
    };

    return {
      changeString: changeString,
      get myString() { 
        return myString;
      }
    }

})();

console.log( Module.myString );
Module.changeString();
console.log( Module.myString );

关于javascript - 模块中的变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48871280/

相关文章:

javascript - 打开对话框时如何禁用页面滚动?

javascript - 数组的返回函数

javascript - 仅当 ‘await’ 选项设置为 ‘module’ 时,才允许使用顶级 ‘esnext' 表达式

javascript - ASP.NET MVC : Javascript error logging in production environement

javascript - 确保尽早评估某一行代码

javascript - 使用 TSQL 到 "minify"javascript 代码?

javascript - 根据值更改 <select> 的颜色 - 仅限 CSS(?)

javascript - 使用 jQuery 更改 href 链接导致 CORS 策略阻塞

javascript - 如何使用 jQuery 更改 css 元素的样式

javascript - 制作粘性 JavaScript