gpt4 book ai didi

javascript - 变量错误,未使用 let 正确初始化

转载 作者:行者123 更新时间:2023-12-02 17:30:26 24 4
gpt4 key购买 nike

我对 JS 中的 Set 类型感到困惑。如果您使用未正确初始化的 Set 创建变量,则无法再使用它(作为 Set 或原始类型)。在控制台中尝试:

let someSet = new Set(4);
/* Uncaught TypeError: number 4 is not iterable (cannot read property Symbol(Symbol.iterator))
at new Set (<anonymous>)*/

someSet
// Uncaught ReferenceError: someSet is not defined

let someSet = new Set([4])
// Uncaught SyntaxError: Identifier 'someSet' has already been declared
someSet
// Uncaught ReferenceError: someSet is not defined

let someSet = 'ho-ho-ho'
// Uncaught SyntaxError: Identifier 'someSet' has already been declared

someSet = 'ho-ho-ho'
// Uncaught ReferenceError: someSet is not defined

你能解释一下为什么吗? 查看屏幕:

enter image description here

最佳答案

这几乎只能在控制台上发生,因为在实际代码中,如果 let someSet = new Set(4);new Set 部分失败,该错误会将您带出 let someSet 所在的范围,因此不会出现此问题。

交互式控制台(例如浏览器中的控制台)必须玩一些具有范围的游戏等。您最终得到了一个已声明但未初始化的变量(已准备好使用);它永远处于暂时死区 (TDZ),因为规范的 InitializeBinding从未对其执行过操作。 (变量是环境对象中的“绑定(bind)”[还有其他类型的绑定(bind)]。)与 var 创建的变量绑定(bind)不同,由 let 创建的变量绑定(bind)可以未初始化。这是一个例子:

{
// `x` is *declared* upon entry to this scope, but not *initialized* yet
x = 5; // Fails because the `x` binding isn't initialized yet
let x;
}

同样,您的确切示例只能在像 Chrome 控制台这样的控制台中出现。如果 new Set(4) 没有抛出错误,则 let someSet = new Set(4); 行将按以下顺序执行这些操作:

  1. 声明(但不初始化)变量(绑定(bind))someSet
  2. 评估初始化器new Set(4)
  3. 使用 #2 的结果值来初始化变量

问题是,由于 new Set(4) 抛出错误,因此第 3 步从未发生。在正常环境中,该错误会将您带出声明 someSet 的范围,但不会在 Chrome 控制台中出现。结果,你根本无法使用 someSet,因为你无法再次声明它(它已经被声明过),并且你无法读取它的值(它没有一个,它是未初始化的),并且您无法向其写入值(因为执行此操作的操作 SetMutableBinding 检查变量是否已初始化,如果未初始化则失败 - 因为这就是 TDZ 的工作原理)。

关于javascript - 变量错误,未使用 let 正确初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56238998/

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