一、什么是词法作用域?
词法作用域是在定义词法阶段的作用域,就是由代码变量和作用域块写在哪里决定的,基本上词法分析器在处理代码时会保持作用域不变。
二、词法作用域特点
完全由写代码期间函数所声明的位置来定义
词法作用域查找只查找一级标志符(foo.bar.baz,只试图查找foo标志符)
三、如何运行时修改词法作用域?
-
eval()
function foo(str,a){
eval(str) //会修改foo函数的词法作用域
console.log(a,b)
}
var b = 2;
foo('var b = 3;',1); // 1,3在严格模式中eval(),有自己的词法作用域
with 中var声明会会被添加到with所处的作用域中,并未参数对象创建了一个全新的词法作用域
eval()和with 会在运行时修改作用域,这样破坏了js引擎在编译阶段根据词法进行静态分析的能力,所有大量的使用会影响代码性能
四、 javaScript 的作用域
函数作用域
函数作用域值属于这个函数的全部变量都可以在整个函数的范围内使用及复用。
函数表达式IIFE: (function foo(){})(),可用于防止污染全局作用域
全局作用域
-
块级作用域
with
try/catch (ES3)
let (ES6)
const
五、总结
javaScript 遵循词法作用域规则,目前有的作用域有全局作用域,函数作用域以及块级作用域,其中函数作用域是最常见的作用域单元。一般情况下词法作用域在编译阶段就已经确定,如果在运行时修改词法作用域会影响代码的运行的性能。