了解let与var hoisting

时间:2016-03-15 20:08:47

标签: javascript ecmascript-6

使用letvar我了解到主要区别在于,变量的范围限定为最近的块并且不会被提升。也可以让变量重新分配,但不能在同一范围内重新声明。为什么这段代码会返回"未定义"错误?

let x = 10;
if (true) {
    console.log(x);
    let x = 11;
}

返回:

Uncaught ReferenceError: x is not defined(…)

while:

let x = 10;
if (true) {
    console.log(x);
}

记录10没有错误?

2 个答案:

答案 0 :(得分:0)

varlet之间的主要区别在于:

var被提升到包裹function块。

let被提升到包裹{}

第二个代码示例与第一个代码示例没有相同的参考冲突,因为您在以下x块中引用if之前声明ReferenceError

编辑要在下面发表Pointy的评论:

由于时间死区,您正在体验let

如果在定义之前在同一个块中引用function do_something() { console.log(foo); // ReferenceError let foo = 2; }定义的变量,则会收到此错误。

  

来自MDN let文档

     

在ECMAScript 2015中,让我们将变量提升到块的顶部。但是,在变量声明之前引用块中的变量会导致ReferenceError。变量位于"临时死区"从块的开始直到处理声明。

     

import os i = 0 while i < 2: os.pause(4) os.system("home/Tyler/desktop/test.py") i += 1

答案 1 :(得分:-1)

let变量实际上已被提升(在块内)。来自MDN

  

在ECMAScript 2015中,让我们将变量提升到块的顶部。

相关问题