我最近开始从事一个 JavaScript 项目,并且来自 Java 世界,有时事情看起来很奇怪,这并不奇怪。
我正在实现一个简单的模块(使用揭示模块模式,据我所知),它将提供基于初始化的配置,但请注意,在 init() 中分配了“本地”变量
函数的值会有所不同,具体取决于它是通过“getter”函数 domain
后getDomain()
访问,还是直接通过模块“public”API 公开的 domain
变量访问。
请参阅以下演示该问题的精简代码。
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
没有指向其他域的链接而不是复制品。
希望对您有帮助! :)
关于JavaScript 揭示模块模式私有(private)变量状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51517822/