编程语言分为:编译型语言和解释型语言。
编译型和解释型语言的区别:编译型语言在程序执行之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以直接运行该二进制文件,而不需要再次重新编译了。而由解释型语言编写的程序,在每次运行时都需要通过解释器对程序进行动态解释和执行
编译型语言:例如java,c
解释型语言:例如JavaScript, python
如图所示:
如图所示,JavaScript代码并不需要编译成二进制文件,所以JavaScript是一种解释型编程语言,它由事件与对象驱动,支持面向过程,面向对象,命令式以及函数式编程。(可以自己去了解)
运行js代码有两个阶段: 编译阶段、执行阶段
本文主讲第一个阶段,执行阶段在下篇
编译阶段
- 词法分析
生成词法单元,例如,var a = 2;这段代码会被分解成这些词法单元:var,a,=,2,;。 - 语法分析
将词法单元流(数组)转换成一个由元素逐级嵌套所组成的抽象语法树(AST),并生成词法作用域 - 代码生成
将AST语法树转换为可执行代码的过程被称为代码生成,在这期间进行内存分配以及生成全局执行环境(上下文)
内存模型:在js引擎完成语法分析进行代码生成时会为变量分配空间(内存)。分为4个区
- 栈区:存放的是真正的值,比如函数的参数值,局部变量。
- 堆区:存放的是对象的引用(逻辑地址),比如function,array
- 静态区:存放的是全局变量和静态变量
- 常量区:存放的是常量
作用域和执行环境
作用域:对变量和函数的访问
- 词法作用域 动态作用域,在js中采用的是词法作用域。
- 一套用于查找变量的规则
- 词法作用域是静态的,它由你写代码时将变量和块作用域写在哪里来决定的
- 词法作用域分为全局作用域,函数作用域以及块作用域
变量查找规则:左查询(LHS)和右查询(RHS),左查询是对变量进行查找,找不到便创建一个变量默认值为undefined。右查询是查找变量的值,如果在全局作用域中未能获取变量的值便会报错为ReferenceError。
举例0:
var a;
console