所谓的块级作用域通俗的讲就是使用{}创造一个代码块,然后在这之中声明的变量在代码块之外都是不可访问的。
在ES6标准发布之前,JavaScript表面上并没有的块级作用域的概念,但其实际包含一些隐式的块级作用域:函数作用域和try/catch。ES6中新增了let关键字,也可以显式的创造块级作用域。
JavaScript中,for循环和if等语句都可以创建“块”,但其并不是块级作用域:
1 | // for |
可见在块里面声明的变量都被泄漏到外部作用域中了。
函数作用域
函数作用域实际上就是一个块级作用域:
1 | function foo() { |
在函数外部对a的RHS查询失败,所以抛出ReferenceError异常。
try/catch
ES3 规范中规定try/catch的catch分句会创建一个块作用域,其中声明的变量仅在catch内部有效。
1 | try { |
let
ES6引入的let关键字配合{}可以显示地创建块级作用域:
1 | { |
const关键字也可以创建块级作用域,只不过const用于声明常量罢了。

