在ES6中吊装的目的是什么?

brk*_*brk 6 javascript ecmascript-6

我知道这let将被提升到块的顶部,但是在初始化之前访问它将抛出ReferenceError到期Temporal Dead Zone

例如:

console.log(x);   // Will throw Reference Error
let x = 'some value';
Run Code Online (Sandbox Code Playgroud)

但是像这样的代码片段会运行而不会出错:

foo(); // alerts foo;
function foo(){    // foo will be hoisted 
  alert("foo");
} 
Run Code Online (Sandbox Code Playgroud)

我的问题

let当它在访问时会出现错误时,将其提升到顶部的目的是什么?也有var遭受TDZ的影响,我知道什么时候会抛出,undefined但是因为TDZ?

Rah*_*thi 4

文档说:

这些变量是在实例化其包含的词法环境时创建的,但在评估变量的 LexicalBinding 之前不能以任何方式访问。由带有初始化程序的 LexicalBinding 定义的变量在计算 LexicalBinding 时(而不是在创建变量时)被分配其初始化程序的赋值表达式的值。如果 let 声明中的 LexicalBinding 没有初始化程序,则在对 LexicalBinding 求值时,该变量将被赋予 undefined 值。

还有var 关键字:

let 允许您声明范围仅限于使用它的块、语句或表达式的变量。这与 var 关键字不同,后者在全局或整个函数的本地定义变量,而不管块作用域如何。

您还可以查看凯尔·辛普森 (Kyle Simpson) 的这篇文章:支持和反对let