javaScript是一门编译型语言。
传统编译语言流程分为:分词/词法分析;解析语法分析;代码生成。
分词/词法分析:将字符串代码分解为有意义的代码块。这些代码块被称为词法单元。
解析/语法分析:将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树(抽象语法树)。
代码生成:将抽象语法树转换为可执行的代码的过程称为代码生成。
javaScript引擎:(负责整个javaScript的编译及执行)
编译不在构建之前,而在代码执行前的几微秒(甚至更短)的时间里,javaScript使用这种方式来保证性能最佳。
编译器:
负责词法分析及代码生成。
作用域:
收集并维护所有声明的标识符(变量),确定当前执行的代码对这些标识符的访问权限。
例:var num = 2
1.编译器询问作用域是否已存在变量num在当前作用域内,如果有则忽略声明,继续编译,如果没有,则作用域在当前作用域集合中声明一个变量num;
2.编译器为引擎生成运行所需代码。引擎询问当前作用域是否存在变量num,如果有则赋值,如果没有则继续寻找。如果最总找到了则会赋值,如若最终没有生成,则抛出异常。
总结:变量的赋值操作会执行两个操作,首先会在当前作用域中声明变量(如果之前没有声明过的话)。然后引擎在当前作用域中查找该变量,并赋值。
左查询/右查询:
左查询:赋值操作的目标是谁(赋值)。 右查询:谁是赋值操作的源头(取值)。