执行上下文 执行栈

96 阅读2分钟

什么是执行上下文?

首先,js执行分为创建阶段、执行阶段。创建阶段包括词法分析、语法分析、作用域规则确定,执行阶段包括创建执行上下文、执行函数确定this指向、最后进行垃圾回收。JS中执行上下文一般被分为三类:

  • 全局执行上下文
  • 函数执行上下文(主要)
  • Eval函数执行上下文

什么是执行栈?

一段程序中只有一个全局执行上下文,但是会有多个函数执行上下文,为了方便管理会使用栈来管理所有的上下文,也就是本文所说的执行栈,采用的是先进先出的数据结构。

  • 执行开始,程序开始运行时,会先创建一个全局环境也就是全局执行上下文,初始化全局对象或全局函数。this指向window,压到栈中最底层。
  • 执行过程中,每碰到一个函数,就会创建一个函数环境也就是新的函数执行上下文,将这个函数执行上下文压到执行栈中。
  • 执行结束后,当该函数执行完同时其他地方没有调用该函数,就从当前的执行栈栈顶弹出。进而依次弹出栈顶执行上下文,直到全局上下文弹出后,程序结束。

总结

简单来说,常说的this指向就是指向其所在的执行上下文。

  • 全局执行上下文中,this 指向全局对象(浏览器中指向 window 对象, nodejs 中指向module对象);
  • 函数执行上下文中,this 指向是动态的,谁调用this就指向谁,函数调用方式不同this指向也不同(默认绑定、隐式绑定、显式绑定、new 绑定、箭头函数),赋值操作也会改变this指向
  • 执行上下文的生命周期
    • 创建阶段:确定 this 指向、生成变量对象、建立作用域链
    • 执行阶段:变量赋值、函数引用、执行其他代码
    • 销毁阶段:执行完毕出栈,等待回收被销毁