Javascript 为什么';t const App=App |{};工作,但使用var吗?

Javascript 为什么';t const App=App |{};工作,但使用var吗?,javascript,ecmascript-6,Javascript,Ecmascript 6,过去我用过 var App = App || {}; 在单独加载到浏览器的各种js脚本中分配或实例化公共应用程序对象 但是,使用let和const而不是var会抛出一个参考错误: const App = App || {}; // or let App = App || {}; Uncaught ReferenceError: App is not defined at <anonymous>:1:11 const-App=App |{};//或者让App=App |{}; 未

过去我用过

var App = App || {};
在单独加载到浏览器的各种js脚本中分配或实例化公共应用程序对象

但是,使用
let
const
而不是
var
会抛出一个参考错误:

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

Uncaught ReferenceError: App is not defined
at <anonymous>:1:11
const-App=App |{};//或者让App=App |{};
未捕获引用错误:未定义应用程序
时间:1:11

这是怎么回事?如果我想继续使用此模式,是否必须坚持使用
var

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

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


还请注意,使用
let
定义的变量或使用
const
定义的常量不能与另一个变量在同一范围内共享其名称空间,无论是使用
let
const
、还是
var
,当javascript引擎看到语句时,
var-App=App |{/code>,它将声明细分如下:

var App;
App = App || {};
由于起重可变,
var-App=App | |{}
分为两部分

  • 声明:
    var应用程序
  • 分配:
    App=App |{}

  • 另一方面,
    let
    const
    声明不涉及变量提升。因此,
    ReferenceError
    ,因为还不存在名为App的变量。

    var
    的行为不同于
    let
    const

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

    对于
    let
    const
    ,只有在声明实际发生时(并且只有在没有立即赋值的情况下),才会将其初始化为
    undefined


    在您的示例中,变量
    App
    仍在中,尝试在该点访问它会导致引用错误。

    如果您仔细想想,如果已经定义了符号“App”,则声明一个名为“App”的新常量毫无意义。如问题中所述,let还抛出错误。如果您还尝试预先声明它(例如,以可能返回null的生成器方式),它将抛出一个已声明的
    错误。我没想到它会那样做。谢谢!我读了你的答案后发现了这篇文章。有助于进一步了解发生了什么:我很高兴能帮助您:)