用javascript es6编写全局常量的正确方法是什么
What is the proper to write a global const in javascript es6?
用javascript es6在脚本中编写全局常量并在其他脚本中使用它的正确方法是什么?
您只需在全局范围内使用const
:
const aGlobalConstant = 42;
这就产生了一个全局常数。它不是全局对象的属性(因为const
、let
和class
不会在全局对象上创建属性),但它是一个全局常量,可供在该全局环境中运行的所有代码访问。
不过,可能值得注意的是,趋势是将从全局范围中移出,事实上,甚至不再让任何代码在全局范围内运行(尽管为了兼容性,浏览器中的顶级脚本总是可以访问全局范围)。
例如:在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常量与不变性无关
- 打破承诺链的好方法是什么
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- knex:根据结果创建数组的合适方法是什么
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 使用Modernizr检测移动设备最可靠的方法是什么
- 确定var是否是javascript中的elementFinder对象的方法是什么
- 用javascript修复这个JSON对象字符串最干净的方法是什么
- 让会话值可用于JavaScript的好方法是什么
- 从AngularJs获取谷歌地图对象的正确方法是什么
- 使用ReactJS和Flux架构从服务器获取数据的正确方法是什么
- 列出没有 mysql 的元素的最佳方法是什么
- 克服错误的更优雅的方法是什么:需要对象说明符.当通过JXA通过Messages发送SMS时,参数没有对象说明符
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 在 Javascript 中实现解耦代码/回调的正确方法是什么?
- 使用Javascript,获取元素的方法是什么,基于打开和关闭标记之间的文本
- 在d3.json中使用d3.csv组合多个csv文件数据输入的最佳方法是什么
- 直接在DOM事件处理程序中调用作用域函数的最短方法是什么