我是一个相对新手的JS开发人员,慢慢地“学习绳索”。
最近我阅读了一些建议,建议使用IIFE来防止全球范围的污染(角度应用的指导原则,但......)。
现在考虑一下sails配置系统,我看到很多带有“自由浮动”代码的例子,例如:
// sails/config/log.js
var Winston = require('winston');
var customLogger = new winston.Logger();
// configure logger
module.exports = {
custom: customLogger,
level: 'info',
}
如果我理解了这个概念,则将customLogger / winston添加到全局范围。
我说错了吗?
我相信如果我想做任何“重要”的事情,我必须在配置文件中编写一些代码 - 在这些情况下,我认为应该适用一般的实践规则......
我应该在这些地方使用IIFE吗?
例如:
// sails/config/log.js
(function() {
var Winston = require('winston');
var customLogger = new winston.Logger();
// configure logger
module.exports = {
custom: customLogger,
level: 'info',
}
}());
这有什么优点/缺点吗?这很重要吗?
答案 0 :(得分:2)
这是一个很好的问题。
Node.js和浏览器/前端JavaScript全局范围的工作方式不同。
在浏览器环境中,您拥有一个全局范围(称为window
),其中包含您在不同脚本中声明的所有内容:
<script>
var a = 'hello';
console.log('first script');
</script>
<script>
var b = 'world';
console.log(a, b);
console.log(window.a, window.b);
</script>
&#13;
IIFE&#34;防止污染全球环境&#34;因为你在其中声明的内容并没有达到全球范围。
<script>
(function () {
var a = 'hello';
console.log('first script');
})();
</script>
<script>
(function () {
console.log(a); // a is not defined
})();
</script>
<script>
(function () {
console.log(window.a); // undefined
})();
</script>
&#13;
您可以使用Module pattern来利用此行为来整理前端代码。
在 Node.js环境中,您可以在不同的文件中声明您想要的内容,除非您希望使用module.exports
,否则无法从其他文件中访问它们
例如,您可以这样做:
// module-a.js
var a = 'hello';
module.exports = a + ' world';
// index.js
var moduleA = require('./module-a');
console.log(moduleA); // 'hello world'
console.log(a); // a is not defined
console.log(moduleA.a); // undefined
所以在你的Sails项目中(使用Node.js执行),你不需要使用IIFE,并且应该使用module.exports
,这已经足够了。