阅读阮一峰老师的《ECMSript6 入门》文章的过程中,对于其中一句话以及结合给出的案例,自己理解起来有些晦涩,于是把自己的理解写下来,如有不对,望指正.
// 第一种写法,报错
if (true) let x = 1;
// 第二种写法,不报错
if (true) {
let x = 1;
}
上面代码中,第一种写法没有大括号,所以不存在块级作用域,而let只能出现在当前作用域的顶层,所以报错。第二种写法有大括号,所以块级作用域成立。
其中“let只能出现在当前作用域的顶层”这句话中的“顶层”该如何理解?
我的理解:
假设这两if都处在全局作用域下,拿第一种写法来说,没有大括号,那x的当前作用域应该就是全局作用域,而if判断的执行体按照es6规范来说不是一个块级作用域,但是其本身就具有一个层级结构,if条件判断一个层,执行体算是下一层,而在执行体内let声明的x变量,此时并不处在全局作用域的顶层,而是全局作用域的第二层,所以会报错。