我知道全局变量不好。
但是,如果我在框架的 40 个文件中使用节点的module“util”,将其声明为全局变量不是更好,例如:
util = require('util');
在 index.js 文件中而不是在 40 个文件中写入该行?
因为我经常在每个文件中使用相同的 5-10 个module,这样可以节省大量时间,而不是一直复制粘贴。
在这种情况下 DRY 不是很好吗?
我知道全局变量不好。
但是,如果我在框架的 40 个文件中使用节点的module“util”,将其声明为全局变量不是更好,例如:
util = require('util');
在 index.js 文件中而不是在 40 个文件中写入该行?
因为我经常在每个文件中使用相同的 5-10 个module,这样可以节省大量时间,而不是一直复制粘贴。
在这种情况下 DRY 不是很好吗?
你可以只拥有一个通用模块。
常见的.js:
Common = {
util: require('util'),
fs: require('fs'),
path: require('path')
};
module.exports = Common;
应用程序.js:
var Common = require('./common.js');
console.log(Common.util.inspect(Common));
每个模块都应该是独立的。在每个模块的第一个需求之后,无论如何都不需要任何费用。
如果您想单独测试一个模块怎么办?您会遇到很多问题,因为它无法识别您的应用程序中的某些“全局”要求。
是的,即使在这种情况下,全局变量也很糟糕。全局变量几乎总是破坏:可测试性、封装性和易于维护。
2012 年 1 月更新答案
该global
对象现在是每个模块内的全局对象。因此,每次分配给模块内的全局变量(无作用域)时,它都会成为global
该模块对象的一部分。
global
因此该对象仍然不是global,并且不能这样使用。
2012 年 12 月更新
该global
对象现在在应用程序中具有全局作用域,可用于存储需要从所有模块访问的任何数据/函数。
global.util = require('util');
节点文档中有一个关于全局对象的部分。
但是,应谨慎使用全局变量。通过向全局空间添加模块,您会降低可测试性和封装性。但在某些情况下,使用这种方法是可以接受的。例如,我将函数和对象添加到全局命名空间以在我的单元测试脚本中使用。
我对这个线程中的答案感到困惑。
我能够做到这一点...
文件:test.js
global.mytest = {
x: 3,
y: function() { console.log('Works.'); }
};
文件:test2.js
console.log('Does this work?');
mytest.y();
文件:server.js
require('test.js');
require('test2.js');
它似乎可以满足所需的问题。第一个 require 将 mytest 对象放入全局范围,然后第二个 require 可以访问该对象而无需任何其他限定符。
我试图弄清楚这一点(这让我从谷歌搜索到了这个线程),我想发布现在似乎对我有用的东西。也许自最初的答案以来事情已经发生了变化。
我已经成功地使用该process
对象来传递我的配置对象。虽然理论上存在与上述完全相同的问题(封装、可测试性等),但它在仅使用非状态修改属性(基本上是带有原语的哈希表)时工作正常。