Sails配置和全局范围

时间:2017-02-01 10:09:17

标签: javascript sails.js

我是一个相对新手的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',
    }
}());

这有什么优点/缺点吗?这很重要吗?

1 个答案:

答案 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;
&#13;
&#13;

IIFE&#34;防止污染全球环境&#34;因为你在其中声明的内容并没有达到全球范围。

&#13;
&#13;
<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;
&#13;
&#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 ,这已经足够了。

More on this