js的编译过程
js的编译可以简化看做三部分
- 分词/词法分析: 将代码拆分为有意义的代码块,也称为词法单元
- 解析/语法分析:将词法单元的数组进行转为程序语法结构的树,也称为抽象语法树
- 代码生成:将生成的抽象语法树转换为计算机可以识别的机器语言进行执行
js的编译与执行关系
js是是动态执行的语言,与一般的编译语言不同之处是它不是提前编译的,任何的js代码在执行前都需要进行编译,且一般是在执行前的很短时间内才进行编译
初步理解js的编译与执行过程需要用到的元素
js的编译执行过程一般需要三个朋友
- 引擎: 一般在程序编译及执行的整个过程中负责
- 编译器:一般负责代码的词法分析以及代码生成的过程
- 作用域: 负责并收集并维护所有标识符组成的一系列查询规则,对各个变量的访问权限进行管理
js的编译过程及执行过程
根据 var a = 2; 进行示例分析
在编译过程中,编译器会碰到a的变量,先与作用域进行确认,查看当前作用域是否存在变量名为a的变量,如果存在,则忽略,如果不存在,则会创建一个变量a,
在生成代码的过程中的赋值操作,引擎会先查看是否有变量a,有的话就直接使用,没有就会继续向上一层作用域查找
变量的赋值操作一般会执行两个过程,一般编译器会先声明一个变量(如果没有声明过),然后在代码运行时引擎会在作用域中进行查找该变量,找到便会赋值
作用域
作用域是查找变量的一套规则,当一个作用域在另一个作用域中嵌套着时,就产生了作用域的嵌套,引擎一般情况下会在当前的作用域中进行查找,如果没有在当前的作用域中找到,就会一层一层向上一层进行查找,直到最外层的作用域(全局作用域)为止。