1.1 编译原理
编译语言
分词/词法分析
解析/语法分析
代码生成
对于Javascript来说,大部分情况发生在代码前的几微秒(甚至更短!)的时间内。在我们所要讨论的作用域背后,Javascript引擎用尽了各种办法(比如JIT,可以延迟编译甚至重编译)来保证性能最佳
1.2理解作用域
1.2.1 演员表
- 引擎
- 编译器
- 作用域
1.2.2 对话
变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值
1.2.3 编译器有话说
赋值操作的目标是谁(LHS)
谁赋值操作的源头(RHS)
a = 2 是LHS引用
console.log(a); 是RHS引用
1.2.4 引擎和作用域的对话
1.2.5 小测验
检验一下到目前的理解程度。 把自己当作引擎, 并同作用域进行一次“ 对话” :
function foo(a) {
var b = a;
return a + b;
}
var c = foo( 2 );
-
找到其中所有的 LHS 查询。( 这里有 3 处! )
c = ..;、 a = 2( 隐式变量分配)、 b = ..
-
找到其中所有的 RHS 查询。( 这里有 4 处! )
foo(2..、 = a;、 a ..、 .. b