传统编译语言 编译会经历三个步骤
1.将字符串分解成代码块(词法单元) var a = 2; --> var、a、=、2、;
2.将代码块数组转换成一个元素逐级嵌套组成的代表了程序语法结构的树(抽象语法树)
3.将抽象语法树转换为可执行的代码
引擎:从头到尾负责整个javascript程序的编译及执行过程
编译器:负责语法分析及代码生成等活动
作用域:负责收集并维护有所有声明的标识符组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限
执行过程
首次编译器会在当前作用域中声明一个变量,然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。
(ps:LHS查询是试图找到变量容器本身,RHS是取到它的源值)
在非严格模式下,引擎在执行LHS查询时查询到全局作用域时如果没有找到目标变量,会创建一个该名称的变量并返还给引擎。
查找规则:
在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量,或抵达全局作用域为止。