一、什么是作用域?
作用域是用来存储变量以及方便寻找变量的一套规则。
二、javaScript 编译过程(编译发生在代码执行前的几微妙)
-
分词/词法分析(Tokenizing/Lexing)->词法单元
-
解析/语法分析(paring)-> AST
-
对运行性能进行优化
-
代码生成 -> 机器指令,创建变量分配内存等操作
三、从 var a = 2;理解 javaScript 的工作原理
-
编译器将var a = 2;分解成词法单元,然后解析成AST抽象语法树;
-
编译器查找作用域中是否已经有a这个变量,有,就忽略继续编译,没有就在当前作用域创建一个新的变量a;
-
编译器为引擎生成运行时所需代码,这些代码用来处理a=2复制操作,引擎运行时先在当前作用域查找a这个变量,有则使用并赋值,无则继续向上级作用域查找。
四、JS引擎执行时查找变量的方式
-
查找声明变量并赋值 LHS
-
查找声明变量并取值 RHS
function foo (a) {//隐试赋值 a = 2 LHS
consloe.log(a)// RHS
}
foo(2) //foo RHS
(RHS )查找不成功是会报ReferenceError,(LHS)不成功在严格模式下会报ReferenceError,在非严格模式下引擎回隐试地创建一个全局变量
五、总结
javascript 执行前会先编译,在编译的过程中,为声明的变量和函数开辟内存空间,以在 javaScript执行时能够找到变量赋值或者取值。而作用域是一套方便高级语言存储和查找变量的一套规则,javascript当然也有自己的一套作用域规则。