与默认语言(ES5默认)不同,JavaScript的严格模式(ES5严格)提供了限制,使语言完全静态作用域。由于存在以下违规行为,默认语言不是完全静态范围的:
with
语句(JavaScript中的对象是动态的,因此JS引擎在评估之前无法知道哪些名称是对象的属性,以及哪些名称绑定到环境中),eval
调用可以动态地为环境添加名称,delete
运算符可以动态删除环境中的名称(适用于隐含的全局变量,以及通过eval调用添加的变量)。来源:http://www.youtube.com/watch?v=Kq4FpMe6cRs&t=42m48s
我可以看到完整的静态作用域有助于提高性能,因为JS引擎可以在评估之前绑定变量(或至少大部分)(在词法环境中的名称)。此外,我猜,该程序变得更具可读性,并且不太可能引起混淆。
但是,我对完全静态范围的好处的理解并不像我希望的那样完整。