1.1执行环境
执行环境可以简称为环境,可以理解为JS被解析和执行所在的外部环境。
1.1.1全局执行环境
全局执行环境是最外层的一个环境,根据宿主环境的不同,全局对象也会有所区别,比如在浏览器中全局环境是window,在node中全局环境就是这个文件的module对象。
1.1.2函数执行环境
每次调用一个函数时,都会创建一个新的执行环境,在这个函数内的任何声明都无法在该函数之外的地方访问
1.1.3Eval函数执行环境
在eval()函数中的代码,不建议使用
1.1.4 执行栈
我们先了解一下执行栈内的执行顺序:后进先出,意思就是最早来的最晚走,最后来的最先走(参考下图理解)
因为JavaScript在浏览器环境中的执行是单线程(就是一次只能做一件事,不能边吃饭边看电视,只能先吃饭再看电视),对于多个任务,只能采用任务队列的方式(就是先吃饭,一定要等吃完饭才能看电视)。
举一个例子(暂时不用去看current execution context这一层,其实就是Execution Context N+1),
- 调用 一个函数f1,执行流先进入全局环境
(Global Execution Context这一层) - f1的环境被推入环境栈中
(Execution Context N+1这一层按照绿色箭头进入) - 这时候函数f1又调用了函数f2,f2的环境被推入环境栈中
(Execution Context N+2这一层按照绿色箭头进入) - f2执行完之后就立马离开执行栈
Execution Context N+2这一层按照红箭头离开 - f1执行完之后在f2离开环境栈后再离开环境栈
Execution Context N+1这一层按照红箭头离开 - 全局环境不会消失,除非关闭浏览器或者关闭网页所以Global Execution Context这一层不会消失
看到这里,我们就能理解另外一个概念:执行环境的两个阶段
1. 创建阶段
- 当函数被调用,但是为执行内部代码之前:
- 创建一个作用域链
- 创建变量,函数和参数。
- 确定this的值。
2, 执行阶段
- 赋值,引用函数,解释/执行代码。