【发布时间】:2020-11-04 18:22:34
【问题描述】:
我开始学习 JavaScript,我在 Google Chrome 中使用 Snippets 或控制台。我不明白一件事。 当我运行 sn-p 时:
let x = 5;
console.log(x);
多次。一切都很好,但是当我第一次运行时:
var x = 5;
console.log(x);
然后我将代码更改为使用 let:
let x = 5;
console.log(x);
我收到错误SyntaxError: Identifier 'x' has already been declared,我不明白为什么。
我假设用 let 声明的变量在某种程度上是“易失的”,但用 var 声明的变量与窗口对象相关联,所以它们是“非易失的”?
或者更一般地说:脚本执行后全局环境的声明性环境记录中的声明是否被清除,但存储在全局环境的对象环境记录中的声明不是?
当我在 Google Chrome Snippets/Console 中多次运行 sn-p 时,它是在相同的执行上下文中运行,还是每次按下运行按钮时都使用新的全局环境重新创建?
【问题讨论】:
-
那是因为当您执行
let x = 5时,您无法再次重新声明变量(因为您提到您多次执行此操作),即稍后let x = ...。相反,您需要重新分配其值,即x = ...。 -
@Terry 实际上,如果我只使用 let 进行声明,我可以毫无问题地运行脚本。仅当我第一次使用 var 然后将其更改为 let 时才会出现问题。示例是完整的 - 它们是 2 行代码。代码中没有重新声明。
-
@swch 如果您不止一次编写
let x = 5并运行代码,但它不会工作。这是 Chrome (V8) 控制台的一些特定优化。 Firefox 控制台抛出错误。 developers.google.com/web/updates/2019/12/… -
将代码复制到控制台时,将其包装在 IIFE 中。这样,您在多次复制时就不必担心重新声明。
标签: javascript ecmascript-6 let executioncontext