【问题标题】:javascript LET variable - why getting undefined and not error when logging before initializing variable?javascript LET 变量 - 为什么在初始化变量之前记录时出现未定义而不是错误?
【发布时间】:2019-10-25 20:55:26
【问题描述】:

我知道 const/let 上有很多帖子,但我找不到任何回答我的问题的内容:

据我所知,使用 let 声明的变量被提升到顶部,但没有像使用 var 那样使用 undefined 进行初始化,因此它们会在初始化之前创建一个临时死区。

在下面的示例中,我记录未定义。如果我的控制台日志在初始化之前出现,为什么它是未定义的?为什么我没有看到参考错误?

let x;
console.log("x: ", x)
x = 1;
//without x= 1 it would be undefined too

编辑

let x; 
console.log("x: ", x) 

最终会被阅读完全一样的

console.log("x: ", x); 
let x = 1

【问题讨论】:

  • 您的解释有误 - initialisation 步骤在您到达 let x 时完成 - x=1assignment 步骤.这是两个不同的东西。如果您将console.log("x: ", x) 作为let x 之前的第一个语句,您将处于时间死区
  • 请注意“温度”。在那句话中是“暂时的”而不是“暂时的”。 "temp" 通常是后者的缩写。

标签: javascript


【解决方案1】:

"let x" 声明了一个变量,但还没有给它赋值。根据 Mozilla 的 JavaScript 文档 - “未分配值的变量是未定义类型。”因此,“x”在被赋值之前的值是“未定义的”。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined#Description

【讨论】:

    【解决方案2】:

    关于吊装和死区的描述是另一种情况:

    console.log("x: ", x);
    let x = 1;
    

    这被视为let x; 出现在顶部。但是,在这种情况下,console.log()出错,因为它出现在声明的“虚拟”位置和初始化程序之间。

    在您的情况下,let x; 没有初始化程序,因此x 可以在声明后的任何位置使用。 x = 1 声明并没有什么特别之处;这只是对x 的另一个参考(嗯,一个作业)。

    【讨论】:

    • 我将添加个人注释,我认为该术语有点过于戏剧化。
    • 啊,这一切都与提升有关 - 使用 let 声明的变量 ARE HOISTED 创建临时。在初始化之前的死区和在使用它们之前创建的变量/未提升的变量不会创建死区并使用 undefined 自动初始化?!
    • @javascripting 不要混淆初始化和赋值。初始化步骤使变量可用。在初始化之前,您不能以任何方式使用它。因此,时间死区 - 您尝试使用不可用的变量。 assignment 是另一回事,而分配之前的 undefined 只是拥有一个您可以使用但尚未分配的变量的副产品。
    • @javascripting 你仍然对提升是什么感到困惑。它不会let x“有效”移动到顶部。当只有var 时,这是一个有用的描述,但它根本不适用于let。检查this article 以获得更深入的了解,但let x = 1 中有三个步骤 - 声明、初始化和赋值。声明只占用x 作为标识符。初始化是使它可用的原因。对于let 声明被提升,对于var声明+初始化
    • @javascripting 初始化和赋值是不同的东西。所以一个变量没有被“未定义”初始化,它被初始化并且它没有值。通过“声明+初始化”,我的意思是当您拥有console.log(x); var x = 1 时,声明 初始化都会被提升 - 这就是为什么您可以在到达以下行之前 使用 变量var - 因为它已初始化。使用console.log(x); let x = 1 only 声明被提升,因此在初始化之前您不能使用该变量 - 由于 TDZ 使用它会导致错误。
    猜你喜欢
    • 2019-12-21
    • 2021-10-19
    • 2018-10-10
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多