这是一张简单的JavaScript运行图(若有错误地方请指出,谢谢你们)。大体分为两个阶段,编译阶段和执行阶段。在上一篇文章【JavaScript变量提高运行机制】中有简单提到过。这篇文章带你们来了解其中的一些概念。javascript
这个过程是将由字符组成的字符串分解为有意义的代码块,这些代码块咱们称之为词法单元(token)。例如:var num = 1;在当前阶段会被分解为var、num、=、一、空格,每个都是一个词法单元,固然空格是不是一个有效的词法单元取决于空格是否在JavaScript是否有意义。css
这个过程主要是将词法单元流(数组)转换为一个由元素嵌套的程序语法树(抽象语法树,AST)。html
这个阶段主要是将AST转换为可执行代码。这个阶段会进行变量的提高。java
引入几个简单的概念:数组
引擎:负责整个JavaScript的编译和执行过程。编译器:负责JavaScript的语法分析和代码生成。做用域:负责收集并维护全部申明的标识符组成的一系列查询,并实施一套规则,肯定当前执行的代码对这些标识符的访问权限。复制代码
JavaScript并非简单的一行行解释执行,而是将JavaScript代码分为一块块的可执行代码块进行执行,JavaScript中主要主要分为三类可执行代码。
浏览器
上图描述了JavaScript的执行过程,具体过程咱们先不看。一个JS引擎主要有一下几部分组成。bash
内存堆(emory Heap):分配内存地址
app
调用栈(Call Stack):代码执行ide
let name = '蜗牛';
function sayName(name) {
sayNameStart(name);
}
function sayNameStart(name) {
sayNameEnd(name);
}
function sayNameEnd(name) {
console.log(name);
}复制代码
当代码进行声明时函数
执行sayName函数时,会把直接函数压如执行栈,而且会建立执行上下文
JavaScript中每个可执行代码,在解释执行前,都会建立一个可执行上下文。按照可执行代码块可分为三种可执行上下文
一、普通函数的调用:this指向window(浏览器环境)
二、对象方法的调用:this指向调用对象
三、构造函数:this指向构造函数实例
四、apply、call、bind:this指向绑定值
五、箭头函数this:this指向外层第一个普通函数调用的this复制代码
词法环境自己包括两个部分:
对于『环境记录器』而言,它又分为两个主要的环境记录器类型:
经过这个文章咱们能够简单的了解相关的JavaScript代码执行机制。