JavaScript代码会经过编译之后才执行。
在编译阶段就会生成执行上下文和可执行代码。
执行上下文是JavaScript执行一段代码时的运行环境。比如执行一个函数就会进入这个函数的执行上下文,确定在该函数执行期间用到的this,变量,函数等等。
接下来就进入了执行阶段,js引擎就开始一步一步执行刚刚生成的可执行代码,
函数执行上下文有3种分类
1全局执行上下文
2函数执行上下文
3eval执行上下文(一般不用)
通过这个我们了解到一段代码执行时可能会有多个执行上下文,那么js是怎么管理这些执行上下文的呢,答案就是通过调用栈,也称为执行上下文栈。执行上下文栈遵循后进先出的原则。调用栈是有大小限制的,当入栈的执行上下文超过一定的数量就会发声栈溢出的问题。一般当你在控制台看到Maximum call stack size exceeded这种报错的时候就是发声了栈溢出,这个时候就要检查代码问题了。
我们知道执行上下文在es2018之后被分为以下几个部分:
变量环境
词法环境
等等
其中具体起作用的就是变量和词法环境。那么他们都是怎么工作的呢?
通过var创建的变量和执行上下文一般都放在变量环境种,通过let和cost创建的变量一般都放在词法环境种,而let 和const 都可以生成块级作用域,这个块级作用域的生成就是在词法环境种生成的每一个独立的执行上下文。在词法环境内部,维护了一个小型栈结构,栈底是函数最外层的变量,进入一个作用域块后,就会把该作用域块内部的变量压到栈顶;当作用域执行完成之后,该作用域的信息就会从栈顶弹出,这就是词法环境的结构 此文章为10月Day013学习笔记,内容来源于极客时间《重学前端》,强烈推荐该课程