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*。如果支持,请始终使用 letconst 【参考方案1】:

我将尝试对此有所了解。一般来说,不管编程语言、环境和用例如何,保持变量/数据范围尽可能窄总是好的做法。这有很多原因,从安全性到简单的命名空间污染和代码组织。

我发现您正处于 JavaScript 之旅的开始阶段。当您开始创建更复杂的应用程序时,您会发现几乎迫使您将变量保持在本地的模式。这是通过在 JavaScript 中使用函数范围来实现的。

在浏览器中,模块和函数之外的代码(实际上它们与您将看到的相同)被认为是在全局范围内,无论如何总是可以使用window 或其他语法(selfframes, this 有时)。但是,在其他环境中,例如 NodeJS,这将不起作用,主要原因有两个。第一个是所有代码都在模块内执行。第二个原因是上面的一些语法甚至都不存在。

在节点中,您可以使用global 访问全局范围。但是,即使使用var,创建的变量也将始终是本地的,因为模块被包装在这样的函数中:

(function(exports, require, module, __filename, __dirname) 
// Module code actually lives in here
);

因此,即使是“exports”、“require”、“module”、“__filename”、“__dirname”等看似全局的变量实际上对于每个模块都是本地的。

globalThis 的引入是为了创建一种跨多个环境访问全局范围的一致方式。

最后,我建议您不要使用var,而是使用constlet,并以理想情况下在全局范围内不公开任何变量的方式组织您的代码。

【讨论】:

我没有理解与模块相关的第一部分,但是当我学习模块时我会理解它,但我知道第二部分不应该使用 var,谢谢你的回答

以上是关于var 是我们声明全局变量和函数的唯一选择吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

变量的作用范围和生命周期

局部变量和全局变量

js中要声明变量吗?

js中三种作用域详解(全局,函数,块级)

怎样理解在函数中声明var x = y = 1后调用函数时, x是局部变量, y是全局变量

声明不带 var 关键字的变量