过去我用过
var App = App || {};
在分别加载到浏览器中的各种js脚本中分配或实例化一个公共App对象。
但是,使用let
和const
代替var
会引发引用错误:
const App = App || {}; // or let App = App || {};
Uncaught ReferenceError: App is not defined
at <anonymous>:1:11
这里发生了什么?如果我想继续使用此模式,我是否必须坚持var
?
答案 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 || {}
分为两部分。
var App
App = App || {}
另一方面,let
和const
声明不涉及变量提升。因此,ReferenceError
,因为还没有名为App的变量。
答案 2 :(得分:0)
var
的行为与let
或const
不同。
对于var
,JS引擎首先创建变量定义,为它们分配内存空间并使用undefined
值初始化它们。只有这样它才能逐行开始执行代码。
如果是let
或const
,只有在声明实际发生时(并且只有在没有立即分配的情况下)才会将其初始化为undefined
。
在您的示例中,变量App
仍在 Temporal Dead Zone 中,并且在此时尝试访问它会导致参考错误。