为什么const app = App || {};工作但使用var呢?

时间:2018-02-17 03:15:23

标签: javascript ecmascript-6

过去我用过

var App = App || {};

在分别加载到浏览器中的各种js脚本中分配或实例化一个公共App对象。

但是,使用letconst代替var会引发引用错误:

const App = App || {}; // or let App = App || {};

Uncaught ReferenceError: App is not defined
at <anonymous>:1:11

这里发生了什么?如果我想继续使用此模式,我是否必须坚持var

3 个答案:

答案 0 :(得分:7)

这是因为当您使用let或常量声明变量时,变量在初始化之前位于temporal dead zone

换句话说,尝试let foo = foo会抛出错误,因为foo仍处于暂时死区,并且无法使用。 const也是如此。

另请注意,定义为let的变量或使用const定义的常量不能与同一作用域中的另一个变量共享其名称空间,无论是let,{{1 },或const

答案 1 :(得分:4)

当javascript引擎看到语句var App = App || {}时,它将语句分解如下:

var App;
App = App || {};

由于可变升降,var App = App || {}分为两部分。

  1. 声明:var App
  2. 作业:App = App || {}
  3. 另一方面,letconst声明不涉及变量提升。因此,ReferenceError,因为还没有名为App的变量。

答案 2 :(得分:0)

var的行为与letconst不同。

对于var,JS引擎首先创建变量定义,为它们分配内存空间并使用undefined值初始化它们。只有这样它才能逐行开始执行代码。

如果是letconst,只有在声明实际发生时(并且只有在没有立即分配的情况下)才会将其初始化为undefined

在您的示例中,变量App仍在 Temporal Dead Zone 中,并且在此时尝试访问它会导致参考错误。