在ECMAScript 5及以下版本中,脚本顶层的var
声明变为全局变量,也就是全局对象的属性(浏览器中为window
)。在ECMAScript 6中,我们现在有模块。模块处于严格模式,因此我们不会通过忘记var
自动创建全局,但如果我在模块的顶层声明var
,它是否成为{的全局属性{1}}对象?如果我使用window
或let
或ES6中添加的任何新声明表单会怎样?
const
答案 0 :(得分:2)
但是如果我在模块的顶层声明一个var,它会成为窗口对象的全局属性吗?如果我在es6中添加let或const或任何新的声明表单怎么办?
在这两种情况下答案都是否定的。仅为脚本(第CanDeclareGlobalVar部分)的声明创建全局属性(如果15.1.8返回true
)。但模块中的VarDeclaredNames
和VarScopedDeclarations
都属于该模块(确切地说是ModuleItem
) - 而不是整个脚本。
无论如何,在模块中封装数据的整个想法(以便每个模块通过已建立的export/import
例程与应用程序的其余部分进行通信)都会被浪费掉。