A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 没名字i 于 2020-3-19 15:23 编辑

什么是执行上下文执行上下文可以理解是JavaScript代码执行的环境。JavaScript的运行环境分为三种:
全局环境:全局环境是指JavaScript执行的默认环境。如果是在浏览器的环境,那就会创建一个window对象;
函数环境:当函数被调用时会创建对于的上下文环境,会进入当前函数中执行代码,并且每次执行函数都会创建对于的执行环境;
eval环境:JavaScript中的eval函数执行内部代码创建的上下文环境,但是这个不推荐使用,具体可以查看eval作用~;
所以,一个JavaScript程序在运行的过程中,会产生多个执行上下文,其中有且只有一个是全局执行上下文。紧接着按照函数的调用顺序,每次调用到函数就会生成对应函数的执行上下文。
JavaScript管理执行上下文
一个页面的执行除了全局上下文还有各种函数调所产生的函数执行上下文,那么JavaScript是怎么管理这些执行上下文的呢?
对于单线程的JavaScript来说,它只能对这些上下文对象一个一个得执行。那如此多的上下文对象,他就必须按照一定的方式来执行,不然很乱哦。这个方式就是,JavaScript引擎会用栈的方式来处理这每一个执行上下文
JavaScript执行上下文过程在JavaScript中,用的方式来管理执行上下文,我们可以称它为执行栈,也可以叫做函数调用栈(Call Stack)。栈是遵循“先进后出,后进先出”的顺序来进行存储。

我们可以把理解成为一个只有一个开口的容器,先放进去的东西处于容器的最底部,而且如果要拿出来的话,它也是最后一个被拿出来(先进后出)。

在栈中,处于最底部的就是我们最开始创建的全局执行上下文对象,它永远是处于栈底。而处于栈顶就是当前正在执行的上下文。也就是当前执行的函数执行上下文会被放在栈顶。

栈的执行流程分为入栈、执行、出栈三个部分。

  • 入栈:代码执行的时候,上下文被创建,并被压入栈中
  • 执行:被压入的上下文中处于栈顶的就是当前的执行上下文,当这个函数被调用完成之后,上下文对象被销毁
  • 出栈:当上下文被销毁后会从栈顶被弹出,称为出栈,紧接着下一个上下文开始执行。
下面我们通过一个栗子来加深理解:



[AppleScript] 纯文本查看 复制代码
function text(){
    console.log('text')
    function text1(){
      console.log('text1')
    }
  text1()
}
text()

执行流程:

  • 创建全局上下文环境,全局执行上下文入栈,处于栈底
  • 遇到text(),创建函数text的上下文对象,text的执行上下文入栈
  • 在函数text内部执行可执行代码,遇到text1(),创建text1的上下文对象,text1的执行上下文入栈
  • text1()代码执行完之后没有新的函数了,那么text1()执行完毕,弹出
  • text1()弹出后接着执行text()的代码,同样没有遇到新的函数,那么text()执行完毕,弹出
  • 此时,页面栈中就只剩下全局上下文在栈底,如果这个时候页面关闭了,那么全局上下文也弹出栈


总结:

  • 在JavaScript执行上下文的过程中,对于所有的上下文对象,只有栈顶的上下文是正在被执行的,其他上下文是处于等待的状态,这也是因为JavaScript是单线程所致
  • 全局上下文在整个调用栈永远都是处于栈底,而且只有唯一的一个,当页面处于活动状态的时候,全局上下文是一直存在的,直到关闭页面它才销毁




链接:https://juejin.im/post/5e72e405f265da57112650bc

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马