gpt4 book ai didi

javascript - 最后的行(尚未执行)如何影响代码的开头?为什么它会抛出不正确的错误?

转载 作者:行者123 更新时间:2023-12-03 16:33:54 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Are variables declared with let or const hoisted?

(7 个回答)



What is the temporal dead zone?

(3 个回答)


2年前关闭。




所以我有一个 x is not defined我的代码中的错误让我有点困惑,因为 x之前已经定义了几行。我不得不花一些时间来调整我的代码,删除和添加行,直到我设法理解它发生的原因。删除所有不必要的信息后,现在代码如下所示:

let foo = 2;
console.log(foo);

if (foo === 2){
console.log(foo);
let foo = 1;
}

它抛出 foo is not defined在第 5 行。当我尝试 console.log(foo) 时弹出错误!如果我删除第 6 行 let foo = 1;代码工作正常。我的意思是在我声明 foo 之前发生了错误第二次。所以第一个问题是:
  • 第 6 行(尚未执行)怎么可能导致第 5 行出错?

  • 我不明白的第二件事是为什么它说 foo is not defined而不是 foo has been already declared .
    如果我替换第二个 letvar第 6 行会出现一个错误,它会显示 foo has been already declared所以看起来不错。但是有 let设置为第二个标识符总是会引发不正确的错误。
  • 为什么会抛出不正确的错误?

  • 在测试了不同的场景后,我注意到结果取决于我使用的标识符:
    identifiers |            result
    ----------------------------------------------
    var var | the code works well
    var let | not defined error
    let var | has been already declared error
    let let | not defined error

    所以第三个问题是:
  • 为什么大家反对使用var在这种情况下,使用 var 加倍代码完美无瑕的唯一方法是什么?是异常(exception)吗?
  • 最佳答案

    1. How is it possible that line 6 (which hasn't been executed yet) makes line 5 end up with an error?


    因为使用 let 声明的绑定(bind)范围(大致称为“变量”) , const , 和 class是整个 block ,而不仅仅是从它们被声明的地方到 block 的末尾。代码进入 block 和执行 let 之间的时间语句称为时间死区 (TDZ),在此期间绑定(bind)存在但未初始化,不能以任何方式使用。刚刚拥有 let foo在 block 阴影外部 foo ,甚至在 let foo 之前在代码流中遇到。

    除了范围之外,这个 TDZ 是 var 之间的最大区别。和 letvar创建一个绑定(bind)并将其初始化为 undefined ,不管 var在哪里声明在范围内。相比之下, let (和 constclass )创建绑定(bind),但直到稍后才初始化它,当 let ( constclass )在代码的逐步执行中遇到。您不能使用未初始化的绑定(bind)。

    1. Why does it throw an incorrect error?


    这不是不正确的。你可以说它措辞不好。 :-) 基本上是说“你不能在这里使用 foo,它没有被初始化。”在我看来,来自 V8(Chrome、Chromium、Brave、新的基于 Chromium 的 Edge 和 Node.js 中的 JavaScript 引擎)的当前错误消息更清晰:

    Uncaught ReferenceError: Cannot access 'foo' before initialization

    关于javascript - 最后的行(尚未执行)如何影响代码的开头?为什么它会抛出不正确的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61461390/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com