在 JavaScript 中函数是最常见的作用域单位。在另一个函数内部声明的变量和函数,实质上对任何外围“作用域”都是“隐藏的”,这是优秀软件的一个有意的设计原则。
但是函数绝不是唯一的作用域单位。块儿作用域指的是这样一种想法:变量和函数可以属于任意代码块儿(一般来说,就是任意的 { .. }
),而不是仅属于外围的函数。
从 ES3 开始,try/catch
结构在 catch
子句上拥有块儿作用域。
在 ES6 中,引入了 let
关键字(var
关键字的表兄弟)允许在任意代码块中声明变量。if (..) { let a = 2; }
将会声明变量 a
,而它实质上劫持了 if
的 { .. }
块儿的作用域,并将自己附着在这里。
虽然有些人对此深信不疑,但是块儿作用域不应当被认为是 var
函数作用域的一个彻头彻尾的替代品。两种机能是共存的,而且开发者们可以并且应当同时使用函数作用域和块儿作用域技术 —— 在它们各自可以产生更好,更易读/易维护代码的地方。
[^note-leastprivilege]: Principle of Least Privilege