gpt4 book ai didi

Javascript模块模式,私有(private)变量去哪里了?

转载 作者:行者123 更新时间:2023-11-30 17:11:58 24 4
gpt4 key购买 nike

我正在致力于实现 Javascript 模块模式,并且我了解如何很好地使用它。我不明白的是一旦函数运行并分配了返回值,私有(private)变量和方法会发生什么的概念。

如果我有这样的模块:

var myModule = (function() {

var privateVar1, privateVar2 = 10, privateLogger, privateHello;

privateLogger = function(someInput) {
console.log(someInput);
};
privateHello = function() { console.log('Hello World!');}

return {
publicVar: 'myName',
publicCounter: 0,
publicIncrementor: function(bar) {
bar++;
privateLogger(bar);
privateHello();
}
}
})();
console.log(myModule);
console.log(myModule.publicIncrementor.toString());

当我运行该文件时,我得到以下输出:

{ publicVar: 'myName',
publicCounter: 0,
publicIncrementor: [Function] }
function (bar) {
bar++;
privateLogger(bar);
privateHello();
}

由此看来,myModule 现在似乎是一个只知道 publicVar、publicCounter 和 publicIncrementor 是什么的变量。那么它怎么知道 privateHello 是什么?实例化后该函数定义存在于何处?它不是 myModule 的一部分(console.log(myModule) 不显示它)。它不是一个全局函数(避免这是这个模式的重点)。那么该函数定义现在位于何处?

还是每次我调用 myModule.publicIncrementor 时 privateHello 函数都被重新定义?

最佳答案

这就是 闭包 出现的地方。privateHelloprivateLoggerprivateVar1privateVar2 的范围仅限于您立即调用的函数,当您的 publicIncrementor 函数访问这些私有(private)变量(在 publicIncrementor 范围之外)时,将创建一个闭包。

因此,回答您的问题:它现在依赖于闭包。关于你的问题,如果它每次都被重新定义,我不是 100% 肯定,但据我所知,每次你从本地范围之外访问一个变量时都会重新创建一个闭包,但它不会重新定义对象,在相反,它将始终引用相同的对象。

关于闭包有很多有趣的答案,因此您可能想看看以下答案: How do JavaScript closures work?

关于Javascript模块模式,私有(private)变量去哪里了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26806362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com