用javascript es6编写全局常量的正确方法是什么

What is the proper to write a global const in javascript es6?

本文关键字:方法 是什么 常量 全局 javascript es6      更新时间:2023-09-26

用javascript es6在脚本中编写全局常量并在其他脚本中使用它的正确方法是什么?

您只需在全局范围内使用const

const aGlobalConstant = 42;

这就产生了一个全局常数。它不是全局对象的属性(因为constletclass不会在全局对象上创建属性),但它是一个全局常量,可供在该全局环境中运行的所有代码访问。


不过,可能值得注意的是,趋势是将从全局范围中移出,事实上,甚至不再让任何代码在全局范围内运行(尽管为了兼容性,浏览器中的顶级脚本总是可以访问全局范围)。

例如:在NodeJS中,没有任何代码在全局范围内运行;所有内容(包括通过node命令运行的主脚本)都在NodeJS模块环境中,这不是全局范围。因此,在NodeJS中,上面的行不会创建全局,因为它的作用域是对模块的调用。要在NodeJS中创建一个真正的全局(这通常是不必要的),您必须在全局对象上创建一个属性。但是如何访问全局对象呢?NodeJS调用代码时this设置为空对象(而不是通常的松散模式默认值,其中this指的是全局对象),当然NodeJS中没有window。答:NodeJS提供了一个全局可用的:global

// Define a global constant in NodeJS
Object.defineProperty(global, "aGlobalConstant", {
    value: 42
});

这是一个常量,因为默认情况下,通过Object.defineProperty创建的属性是只读的。

ES2015的模块比NodeJS更进一步:除非环境为您提供像NodeJS的global这样的全局(在这种情况下,您可以做Object.defineProperty的事情),否则您根本无法创建全局。默认情况下,根据规范,没有这样的全局;只是环境定义了它们(浏览器上的window,NodeJS中的global,…)。而且ES2015模块中的顶级代码并不是用引用全局对象的this的旧默认值运行的(this在ES2015模块的顶级范围中具有值undefined),所以你不能对它使用this

上面的答案很好,尤其是关于"const、let和class不在全局对象上创建属性"的注释。

只是想补充一点,注意与IFrame相关的含义。

在IFrame中,您可以通过引用"parent.someVar"来访问父窗口中定义的变量(如果它们来自同一域)。

但是,由于"const"、"let"或"class"不会添加到其全局对象的属性中,iFrame无法访问父窗口中由const或let定义的变量。但是,如果您在父窗口中用"var"将它们定义为变量,则可以。

通过这种方式,"var"为您提供了一个比"const"或"let"更全局的引用。如果你需要创建一个在子框架中可用的变量,你需要使用"var"来声明它。但是它不会是一个"常数"。

因此,回答你的问题的一种方法是说,虽然你可以用"var"定义"全局变量",但你不能定义(真正的)"全局常量",因为如果它们用"const"声明,它们在iFrame中就不可见,如果它们用‘var’定义,它们就不会是常量。

除非有某种方法可以访问父窗口中定义的常量。我还没找到。有吗?

您可以在全局范围内创建全局变量,如

<script>
  var MYGLOBAL = 1;

类似地,你可以创建像这样的全局常数

const MYGLOBAL = 1;

为了使其全局化并可供脚本中的所有函数访问,您必须在函数范围之外声明它,即在全局级别声明它。

您可以参考MDN常量:

const声明创建对某个值的只读引用。它并不意味着它所持有的值是不可变的,只是变量无法重新分配标识符。

此外,您可能还想阅读这篇文章:ES6常量与不变性无关