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

Javascript 为什么全局变量被认为是不好的做法?(node.js),javascript,node.js,Javascript,Node.js,我目前面临一个问题,我调用了两个模块,它们需要能够修改相同的变量。 我决定创建一个名为global.APP_NAME={}的全局变量,并将需要的变量存储在其中 但我一直在读到使用全局变量是一种不好的做法。为什么 我只创建了一个变量,它不应该与任何其他变量冲突,因为它是我的应用程序的名称。全局变量在几乎所有编程语言中都被视为反模式,因为它们使代码很难跟踪和调试 浏览代码时,您永远不知道哪个函数设置或使用全局变量。当所有变量都是局部变量或传递给函数时,可以确保函数的副作用是有限的。 全局变量在一定距

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

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


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

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

浏览代码时,您永远不知道哪个函数设置或使用全局变量。当所有变量都是局部变量或传递给函数时,可以确保函数的副作用是有限的。 全局变量在一定距离内工作。在应用程序的完全不同的部分中,使用全局值可能会产生意想不到的效果。当您调试由此引起的错误时,您将很难找到变量被更改为错误值的位置。 全局变量共享一个名称空间,因此您可以无意中重用它们,尽管您并不打算这样做。 很难说全局变量有多重要。你永远不知道它是否只被两个函数使用,或者它的值是否在所有地方都很重要。 …还有更多的原因。。。
当您有两个模块共享数据时,您应该使用该数据创建一个对象,并显式地将其传递给每个需要它的函数,并且只传递给实际需要它的函数。

全局变量在几乎任何编程语言中都被视为反模式,因为它们使代码很难跟踪和调试

浏览代码时,您永远不知道哪个函数设置或使用全局变量。当所有变量都是局部变量或传递给函数时,可以确保函数的副作用是有限的。 全局变量在一定距离内工作。在应用程序的完全不同的部分中,使用全局值可能会产生意想不到的效果。当您调试由此引起的错误时,您将很难找到变量被更改为错误值的位置。 全局变量共享一个名称空间,因此您可以无意中重用它们,尽管您并不打算这样做。 很难说全局变量有多重要。你永远不知道它是否只被两个函数使用,或者它的值是否在所有地方都很重要。 …还有更多的原因。。。
当您有两个模块共享数据时,您应该使用该数据创建一个对象,并显式地将其传递给每个需要它的函数,并且只传递给那些真正需要它的函数。

您可以从大多数注释和其他答案中了解为什么使用全局数据被认为是不好的做法。但是,node.js应用程序通常从一个中心点运行,比如app.js、server.js或类似的东西

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

var config = {
  myVar: 100
}
如果需要在某些模块中访问此变量,请将其作为参数传递。 即,在全局文件中,将其称为:

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

您可以从大多数评论和其他答案中了解为什么将全局app.js视为不好的做法。但是,node.js应用程序通常从一个中心点运行,比如app.js、server.js或类似的东西

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

var config = {
  myVar: 100
}
如果需要在某些模块中访问此变量,请将其作为参数传递。 即,在全局文件中,将其称为:

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

一般来说,重载全局范围是一种不好的做法。一个变量是可以的,但如果您将变量放入一个名称空间(如global.myProject={…}),则会更好。尽可能将所有内容保持在本地,以避免冲突,但也提高了代码的可读性,因为您在试图理解代码时不必一直离开本地范围。此问题与任何特定语言或平台无关,适用于所有语言。不要将您的研究局限于node.js。例如,对C++的要求是一样的,答案基本上和你的相关。
我只对一个变量APP_NAME.users使用它。我需要能够跨位于不同模块/文件中的所有函数修改users变量。所以这是我能想出的唯一解决办法。我没有给它命名为用户,因为我想避免冲突。如果你继续添加变量,如果你养成了这样的习惯,这是一个糟糕的做法。使用很少的变量并不意味着它是坏的。一般来说,重载全局范围是一种不好的做法。一个变量是可以的,但如果您将变量放入一个名称空间(如global.myProject={…}),则会更好。尽可能将所有内容保持在本地,以避免冲突,但也提高了代码的可读性,因为您在试图理解代码时不必一直离开本地范围。此问题与任何特定语言或平台无关,适用于所有语言。不要将您的研究局限于node.js。例如,对C++的要求是一样的,答案基本上与你的案例相关。我只使用它作为一个变量AppnNAM.USER。我需要能够跨位于不同模块/文件中的所有函数修改users变量。所以这是我能想出的唯一解决办法。我没有给它命名为用户,因为我想避免冲突。如果你继续添加变量,如果你养成了这样的习惯,这是一个糟糕的做法。使用很少的变量并不意味着它不好。你找到了一个更好的方法来做我想做的事。我切换到一个对象,现在它可以工作了,比全局更快。+1非常感谢。你找到了一个更好的方法来做我想做的事。我切换到了一个对象,现在它可以工作了,速度比全局更快。