为什么全局变量被认为是不良做法? (的node.js)

时间:2013-09-05 11:29:32

标签: javascript node.js

我目前遇到的问题是我有两个模块,我称之为需要能够修改同一个变量。
我决定创建一个名为global.APP_NAME = {}的全局变量,并存储我需要的变量。

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

我只创建一个变量,不应该与其他任何东西发生碰撞,因为它是我的应用程序的名称。

2 个答案:

答案 0 :(得分:12)

几乎所有编程语言都认为全局变量是一种反模式,因为它们很难跟踪和调试代码。

  • 当您浏览代码时,您永远不知道哪个函数设置或使用全局变量。当所有变量都是本地变量或传递给函数时,您可以确定函数的副作用是有限的。
  • 全局变量在远处工作。拧入全局值可能会在应用程序的完全不同部分产生意外影响。当您调试由此引起的错误时,您将很难找到变量更改为错误值的位置。
  • 全局变量共享命名空间,因此您可能会无意中重用它们,尽管您不打算这样做。
  • 很难说全局变量有多重要。你永远不知道它是仅仅由两个函数使用,还是它的值在整个地方都很重要。
  • ......还有更多原因......

当你有两个共享数据的模块时,你应该创建一个包含该数据的对象,并将其显式传递给需要它的每个函数(并且只传递那些实际存在的函数)。

答案 1 :(得分:2)

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

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

var config = {
  myVar: 100
}

如果您需要在某些模块中访问此变量,请将其作为参数传递。 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将使用该方法修改其全局值。