JavaScript Revealing Module模式私有变量状态

时间:2018-07-25 11:30:14

标签: javascript revealing-module-pattern

我最近开始从事JavaScript项目,并且从Java世界中获得的东西有时似乎很奇怪。

我正在实现一个简单的模块(使用显示模块模式,afaik),该模块将基于初始化提供配置,但是请注意,在domain函数中分配了“本地”变量init()后,其值有所不同取决于是通过“ 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函数返回的变量在直接访问时如何具有不同的值?

比你提前!

2 个答案:

答案 0 :(得分:2)

由于@Query( value = "select count(*) from image_set b where b.camera_id = ?2", nativeQuery = true) fun countByTableIdAndImageSetTimeBetween(tableId: Long, cameraId: Long, fromDateTime: LocalDateTime, toDateTime: LocalDateTime): Long 是字符串,因此您不是在复制/返回引用,而是在复制值。

因此,当您使用privateDomain函数更改域时,它只会更新init,因为privateDomain除了作为副本外没有与其链接。

希望有帮助! :)

答案 1 :(得分:1)

这是因为当返回域时,它的值仍然是“默认”。这是Javascript的工作方式,更多信息请点击:Javascript by reference vs. by value

但是当您使用函数“ getDomain”时,您将获得更新后的值。

还可以查看get / set语法:Getter