所谓的块级作用域通俗的讲就是使用{}
创造一个代码块,然后在这之中声明的变量在代码块之外都是不可访问的。
在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
用于声明常量罢了。