执行过程
词法分析
-> 语法分析
-> 预编译
-> 解释执行
一. 词法分析
核心:词法分析是将字符流(char stream)转换为记号流(token stream)。把输入的字符串分解为一些对编程语言有意义的代码块(词法单元)
词法分析主要有三个步骤
- 分析参数
- 再分析变量的声明
- 分析函数声明
开始前先上一段代码:
function func(age) {
console.log(age);
var age = 25;
console.log(age);
function age() {
}
console.log(age);
}
func(18);
复制代码
函数在运行的瞬间,生成一个活动对象(Active Object),简称 AO
.
- 分析参数
- 函数接收形式参数,添加到 AO 的属性,并且这个时候值为
undefine
,即AO.age=undefine
- 接收实参,添加到 AO 的属性,覆盖之前的
undefine
.
- 分析变量声明
如 var age;
或 var age=18
;
- 如果上一步分析参数中 AO 还没有
age
属性,则添加 AO 属性为undefine
,即AO.age=undefine
. - 如果AO上面已经有
age
属性了,则不作任何修改。
- 分析函数的声明
- 如果有function age(){}把函数赋给AO.age ,覆盖上一步分析的值。
二. 语法分析
核心:会将上一步的词法单元集合分析并最终转换为一个由元素逐级嵌套所组成的代表了程序语法结构的树,即抽象语法树(AST) :::
想详细了解AST可移步至:AST
三. 预编译
核心:将上一步的AST转换为可执行代码
当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理。并且是先预声明变量,再预定义函数。
四. 解释执行
在执行过程中,JavaScript 引擎是严格按着作用域机制(scope)来执行的,并且 JavaScript 的变量和函数作用域是在定义时决定的,而不是执行时决定的。JavaScript 中的变量作用域在函数体内有效,无块作用域;