1.1 编译原理
在传统编程语言的流程中,程序中的一段源代码在执行前会经历三个步骤,统称为“编译”。
- 分词/词法分析(Tokenizing/Lexing)
- 解析/语法分析(Parsing)
- 代码生成
1.2 理解作用域
LHS:试图找到变量的容器本身(变量出现在赋值操作左侧),查找的目的是对变量进行赋值
RHS:简单地查找某个变量的值(右侧),目的是获取变量的值
1.3 作用域嵌套
找不到就往再上一层找
所以这种代码也能执行:
function foo(a){
console.log(a+b);
}
var b=2;
foo(2);//4
1.4 异常
如果RHS在所有嵌套作用域中找不到所需变量,引擎会抛出ReferenceError异常。
如果LHS找不到,会在全局作用域 中创建一个(前提是非“严格模式”下,严格模式下抛出异常)
ReferenceError同作用域判别失败相关
TypeError代表作用域判别成功,但对结果的操作时非法或不合理。
1.5 小结
赋值操作符会导致LHS查询,
=操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。