【发布时间】:2016-08-27 16:41:23
【问题描述】:
模块的主要好处(我听说过)是它们隐藏了私有变量。
var Module = (function() {
var privateProperty = 'foo';
return {
publicProperty: '...',
publicMethod: function(args) { ... }
}
})();
但 IIFE 不是必须的。如果你只是删除它,privateProperty 无论如何都会被隐藏。那么为什么要使用 IIFE?我正在尝试理解其中的原理。
编辑:
我一直在读到,没有 IIFE 的 privateProperty 将成为全局范围的一部分。我认为这是错误的。
如果我执行以下操作:
console.log(privateProperty); // => Reference Error: privateProperty isn't defined
我收到一个参考错误。如果我这样做:
console.log(Module.privateProperty) // => undefined
我不确定。如果我这样做:
var mod = new Module();
console.log(mod.privateProperty); // => undefined
我不确定。全局作用域无法访问 JS 中的局部作用域。
编辑 2:
test.js
var test = (function() {
var privateProperty = 'foo';
return {
publicProperty: 'bar',
}
})();
test.js
var test1 = function() {
var privateProperty = 'foo';
return {
publicProperty: 'bar',
}
};
index.html ...
<script src="./test.js"></script>
<script src="./test1.js"></script>
<script>
console.log(test.privateProperty); // => undefined
console.log(test1.privateProperty); // => undefined
</script>
当我尝试上述方法时,无论哪种情况,我都无法访问 privateProperty。人们在谈论的名字碰撞在哪里? IIFE 解决了什么问题?
【问题讨论】:
-
"privateProperty 无论如何都会被隐藏。" - 不是吗?它将与
Module在同一范围内,这正是我们在这里试图避免的? -
你说的是 es6 模块吗?
-
@Bergi 为什么我们要避免模块中的范围。我认为私有变量的意义在于它们隐藏在模块之外(或函数范围之外)。
-
@Bitten 是的。就像使用 module.exports 或 export 或 export default ...
-
@jro:在 (node, commonjs, ES6) 模块中,
var privateProperty确实已经是本地的了。 模块模式 的目的是在您必须使用在全局范围内执行的脚本而不是模块时允许同样的事情。
标签: javascript module iife