为什么全局variables被认为是不好的做法 (node.js)

我目前面临一个问题,我有两个模块,我需要能够修改相同的variables。
我决定创build一个名为global.APP_NAME = {}的全局variables,并存储我需要的variables。

但我一直在读,使用全局variables是不好的做法。 为什么?

我只创build一个variables,不应该与其他任何事物相冲突,因为它是我的应用程序的名称。

全局variables在几乎任何编程语言中都被认为是反模式,因为它们使得很难跟踪和debugging代码。

  • 当你浏览代码时,你永远不知道哪个函数设置或使用了一个全局variables。 当所有的variables都是局部的或者传递给一个函数的时候,你可以确定函数的副作用是有限的。
  • 全局variables在一定程度上起作用。 与全球价值挂钩可能会在应用程序的完全不同的部分产生意想不到的效果。 当您debugging由此引起的错误时,您将很难findvariables的错误值。
  • 全局variables共享一个名称空间,所以尽pipe你不打算这样做,你可以无意中重复使用它们。
  • 很难说全球variables有多重要。 你永远不知道它是否被两个函数所使用,或者它的价值是否重要。
  • …还有更多的理由

当你有两个共享数据的模块时,你应该创build一个包含这些数据的对象,并明确地将它传递给每个需要它的函数(而只有那些实际执行的)。

你可以阅读大部分的评论和其他答案,为什么有一个全球认为不好的做法。 但是,node.js应用程序通常是从中心点运行的,如“app.js”,“server.js”或类似的东西。

在这种情况下,你可以保留某种“configuration”(你说你需要APP_NAME.users)作为该文件的configuration选项。 所以在“app.js”中你有:

 var config = { myVar: 100 } 

如果您需要在某些模块中访问此variables,请将其作为parameter passing。 IE浏览器。 在全局文件中调用它为:

 var module = require('./lib/myModule.js').init(config); 

现在你的模块可以把它的init函数导出,这样它就可以设置它自己的config的本地副本。 例:

 var localConfig = null; exports.init = function(config) { // merge the two config objects here localConfig.myVar = config.myVar; } 

最后,你可以让你的本地代码影响具有私有价值的全局对象。 在你的模块中是这样的:

 exports.modifyGlobalConfig = function() { global.myVar = myLocalValue; } 

你的全局app.js将使用该方法来修改它的全局值。