我是一个相对新手的 JS 开发人员,正在慢慢“学习诀窍”。
最近我读了一些建议使用 IIFE 的指南防止全局范围的污染( Angular 应用程序的指导方针......)。
现在考虑 sails 配置系统,我看到很多带有“自由 float ”代码的示例,例如:
// 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',
}
}());
这有什么优点/缺点吗?重要吗?
最佳答案
这是个好问题。
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>
IIFE“防止污染全局环境”,因为您在其中声明的内容不会进入全局范围。
<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>
您可以利用此行为通过使用 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
.
关于javascript - Sails 配置和全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976987/