javascript - Sails 配置和全局范围

标签 javascript sails.js

我是一个相对新手的 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 .

More on this

关于javascript - Sails 配置和全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976987/

相关文章:

javascript - 动态键类型与 typescript 中的其他键类型

javascript - 这个声明的最后部分有什么作用?

javascript - 通过一次 API 调用在多个表中创建多条记录的最有效方法是什么(sequelize/postgres/node.js)

javascript - 为什么 "navigator.maxTouchPoints = 10"在桌面上的 chrome 中?

android - 从客户端(iOS 和 Android)向 Sails.js 服务器发送套接字请求

database - SailsJS 的外键约束

javascript - 在模型更新时向不同客户端发送响应

node.js - async.each 数组项排序顺序自动更改

session - SailsJs 10 rc 9 connect-redis 错误

json - Elasticsearch:如何在将 json 数据上传到 Elasticsearch 之前创建映射