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

JavaScript Revealing Module pattern private variable state

我最近开始从事一个 Java 脚本项目,来自 Java 世界的事情有时看起来很奇怪,这并不奇怪。

我正在实现一个简单的模块(使用显示模块模式,afaik),它将提供基于初始化的配置,但请注意,在 "local" 变量 domain 被分配到 init() 之后function 它的值不同,取决于它是通过 "getter" 函数 getDomain() 访问还是直接通过 domain 变量访问,如通过模块 "public" API.

请参阅以下演示该问题的精简代码。

var ConfigManager = (function() {

  var privateDomain = 'default';

  function init(dom) {
    privateDomain = dom;
  }

  function getDomain() {
    return privateDomain;
  }

  return {
    init: init,
    domain: privateDomain,
    getDomain: getDomain
  };

})();

console.log(ConfigManager.domain); // Prints 'default'
console.log(ConfigManager.getDomain()); // Prints 'default'

ConfigManager.init('new domain');

console.log(ConfigManager.domain); // Prints 'default' <-- What??
console.log(ConfigManager.getDomain()); // Prints 'new domain'

在这一点上,我很困惑从 getter 函数返回的变量在直接访问时如何具有不同的值?

比你提前!

由于 privateDomain 是一个字符串,您不是在复制/返回引用,而是在复制/返回值。

因此,当您使用 init 函数更改域时,它只会更新 privateDomain,因为 domain 除了作为一个复制.

希望对您有所帮助! :)

这是因为在返回域时,它的值仍然是"default"。这就是 Javascript 的工作原理,更多信息在这里:Javascript by reference vs. by value

但是当你使用函数"getDomain"时你会得到更新后的值。

另请查看 get/set 语法:Getter