当前位置: 首页 > 面试题库 >

为什么将全局变量视为不良做法?(node.js)

路思源
2023-03-14
问题内容

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

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

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


问题答案:

几乎在所有编程语言中,全局变量都被视为反模式,因为它们使遵循和调试代码变得非常困难。

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

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



 类似资料:
  • 问题内容: 我一直看到警告,不要在JavaScript中使用全局变量,但是似乎人们说这的唯一原因是因为阻塞了全局名称空间。我可以想象通过将所有变量放入一个大对象中来轻松解决此问题。现在的问题是:除了方便起见,还有其他原因不使用全局变量吗?它们是否涉及任何性能或兼容性问题? 问题答案: 它们使全局名称空间混乱,并且查找速度比局部变量慢。 首先,拥有许多全局变量始终是一件坏事,因为很容易忘记您在某个地

  • 问题内容: 有一个很大的材料了有这表明印刷异常的堆栈跟踪是不好的做法。 例如从Checkexp中的RegexpSingleline检查: 可以使用此检查来查找常见的不良做法,例如调用ex.printStacktrace() 但是,我正在努力寻找能够给出正当理由的任何地方,因为肯定可以使堆栈跟踪对于跟踪导致异常的原因非常有用。我知道的事情: 最终用户永远不应看到堆栈跟踪(出于用户体验和安全目的) 生

  • 问题内容: function foo () { global $var; // rest of code } 在我的小型PHP项目中,我通常采用过程方式。通常,我有一个包含系统配置的变量,当我需要在函数中访问此变量时,我会这样做。 这是不好的做法吗? 问题答案: 当人们谈论其他语言的全局变量时,这意味着与PHP中的操作有所不同。那是因为变量在PHP 中并不是 真正的 全局变量。典型的PHP程序的范

  • 问题内容: 看到这个答案。它说: 六个非常糟糕的例子; … 锁定在可变字段上。例如,synced(object){object = …; } 锁定可变字段有什么问题?如果被声明为但不是不可变的类怎么办? 问题答案: 这是一个坏主意,因为如果另一个线程更改了关键部分中的引用,则这些线程将不再看到相同的引用,因此它们将不会在同一对象上同步,从而不受控制地运行。例: 假设有2个线程试图进入此关键部分。线

  • 问题内容: 以及你使用哪种替代策略来避免LazyLoadExceptions? 我确实了解到公开会议存在以下问题: 在不同的jvm中运行的分层应用程序 事务仅在最后提交,最有可能你希望在结果之前提交。 但是,如果你知道你的应用程序在单个vm上运行,为什么不通过使用开放会话视图策略来减轻痛苦呢? 问题答案: 因为从性能和理解的角度来看,在视图层中发送可能未初始化的代理(尤其是集合)并从那里触发hib

  • 我试图理解将jwt存储在本地存储(倾向于xss)与cookie(倾向于csrf)的安全含义。我想了解如果我将jwt令牌存储在前端的应用状态中的安全性影响,就像在redux商店中一样。 编辑: 我试图了解有关存储代币的更多信息。似乎所有的文章和答案实际上都是在确定有两种方法可以做到这一点后开始讨论的,即cookie或浏览器存储。像这样一个相关的问题:在浏览器中的何处存储JWT?如何防范CSRF?像这