ES6 引入了 let 和 const 关键字,从而使 JavaScript 也能像其他语言一样拥有了块级作用域。
function letTest() {
let x = 1;
if (true) {
let x = 2; // 不同的变量
console.log(x); // 2
}
console.log(x); // 1
}
JavaScript 引擎是如何同时支持变量提升和块级作用域的?
变量提升是通过变量环境
来实现,而块级作用域就是通过词法环境的栈结构
来实现的,通过这两者的结合,JavaScript 引擎也就同时支持了变量提升和块级作用域了。
思考题
let myname= '极客时间'
{
console.log(myname)
let myname= '极客邦'
}
【最终打印结果】:VM6277:3 Uncaught ReferenceError: Cannot access 'myname' before initialization
【分析原因】:变量会经历创建、初始化、赋值3个过程。在块作用域内,let声明的变量被提升,但变量只是创建被提升,初始化并没有被提升,在初始化之前使用变量,就会形成一个暂时性死区。
【拓展】
var的创建和初始化被提升,赋值不会被提升。
let的创建被提升,初始化和赋值不会被提升。
function的创建、初始化和赋值均会被提升。
补充
在ES3开始,try /catch 分句结构中也具有块作用域。