var 是我们声明全局变量和函数的唯一选择吗? [关闭]
Posted
技术标签:
【中文标题】var 是我们声明全局变量和函数的唯一选择吗? [关闭]【英文标题】:Is var the only option we have for declaring global variables and functions? [closed] 【发布时间】:2021-08-10 14:38:55 【问题描述】:在这个页面上:
我发现使用 var 很重要,我们不能使用 let 和 const 来声明全局变量和函数,但我尝试使用 let 和 const。那么我应该使用它们还是不推荐使用它们?
这是我运行的代码:
let a;
globalThis.a = 3;
console.log(globalThis);
这是输出:
因此您可以清楚地看到添加的内容没有任何错误。那么我应该继续使用这个还是这个工作但不推荐?
【问题讨论】:
你有一个Window
对象,为什么要标记node.js?
它被标记为 nodejs 因为这个问题与我们运行 javascript 的每个环境有关。
你有什么问题?
我的问题是,建议只使用 var 或者没有这样的界限
现在几乎没有理由使用var
*。如果支持,请始终使用 let
和 const
。
【参考方案1】:
我将尝试对此有所了解。一般来说,不管编程语言、环境和用例如何,保持变量/数据范围尽可能窄总是好的做法。这有很多原因,从安全性到简单的命名空间污染和代码组织。
我发现您正处于 JavaScript 之旅的开始阶段。当您开始创建更复杂的应用程序时,您会发现几乎迫使您将变量保持在本地的模式。这是通过在 JavaScript 中使用函数范围来实现的。
在浏览器中,模块和函数之外的代码(实际上它们与您将看到的相同)被认为是在全局范围内,无论如何总是可以使用window
或其他语法(self
, frames
, this
有时)。但是,在其他环境中,例如 NodeJS,这将不起作用,主要原因有两个。第一个是所有代码都在模块内执行。第二个原因是上面的一些语法甚至都不存在。
在节点中,您可以使用global
访问全局范围。但是,即使使用var
,创建的变量也将始终是本地的,因为模块被包装在这样的函数中:
(function(exports, require, module, __filename, __dirname)
// Module code actually lives in here
);
因此,即使是“exports”、“require”、“module”、“__filename”、“__dirname”等看似全局的变量实际上对于每个模块都是本地的。
globalThis
的引入是为了创建一种跨多个环境访问全局范围的一致方式。
最后,我建议您不要使用var
,而是使用const
和let
,并以理想情况下在全局范围内不公开任何变量的方式组织您的代码。
【讨论】:
我没有理解与模块相关的第一部分,但是当我学习模块时我会理解它,但我知道第二部分不应该使用 var,谢谢你的回答以上是关于var 是我们声明全局变量和函数的唯一选择吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章