1

我目前面临一个问题,我有两个我调用的模块需要能够修改同一个变量。
我决定创建一个名为的全局变量global.APP_NAME = {}并将我需要的变量存储在其中。

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

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

4

2 回答 2

13

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

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

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

于 2013-09-05T11:45:47.710 回答
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 函数,以便它设置自己的本地配置副本。例子:

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 将使用该方法来修改它的全局值。

于 2013-09-05T12:06:31.710 回答