You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript执行上下文及调用栈运行机制相关问题咨询

function a(){
    b();
    var c;
}

function b(){
    var d;
}

a();
var d;

你对执行上下文的理解存在一个核心偏差:所有var声明、函数声明的扫描和初始化,全都是在对应执行上下文的创建阶段100%完成的,执行阶段遇到这些声明会直接跳过,根本不存在“等子函数执行完再回头扫描当前作用域变量”的逻辑。

下面按JS引擎的实际执行顺序拆解全流程,所有逻辑严格对齐ECMAScript规范:

全流程执行步骤

1. 全局执行上下文(GEC)初始化

JS引擎执行任何代码前,会首先创建全局执行上下文,压入执行栈栈底,这个阶段不跑任何业务代码,只做声明收集:

  • 扫描全局作用域的所有函数声明:在全局变量对象(VO,全局环境下就是全局对象GO)上绑定a、b两个属性,值直接指向堆内存中存储的对应函数对象,这一步完成后函数就已经可以被调用了
  • 扫描全局作用域的所有var声明:在GO上绑定全局变量d,初始值设为undefined
  • 声明收集完成后,GEC正式进入执行阶段,开始逐行执行全局代码。

2. GEC执行阶段

执行阶段的规则很简单:逐行跑当前上下文中的可执行语句,遇到函数声明、var声明直接跳过(创建阶段已经处理过):

  • 开头的function a(){...}、function b(){...}是函数声明,直接跳过
  • 执行到a()调用语句:GEC的执行立刻在当前位置暂停,执行权移交,创建a函数的执行上下文压入栈顶,开始处理a的上下文流程

    a函数执行上下文初始化(创建阶段)

    进入a函数代码执行前,先扫描a作用域内的所有声明:
    • 无函数声明,只有var c,因此在a的活动对象(AO,函数环境下的变量对象叫AO)上绑定c属性,初始值undefined
    • 声明收集完成后,a的执行上下文进入执行阶段

    a函数执行阶段

    逐行执行a内的代码:
    • 第一行是b()调用语句:a的执行立刻在当前位置暂停,执行权移交,创建b函数的执行上下文压入栈顶,开始处理b的上下文流程

      b函数执行上下文初始化(创建阶段)

      扫描b作用域内的所有声明:var d,在b的AO上绑定内部变量d,初始值undefined

      b函数执行阶段

      b内部只有var d声明,直接跳过,无其他可执行代码,b执行完毕:b的执行上下文从栈顶弹出,其AO如果没有被闭包引用会直接被垃圾回收,b的生命周期彻底结束。
    • b弹出后,执行权交回a的上下文,从之前暂停的位置继续往下执行:下一行是var c声明,直接跳过,无其他可执行代码,a执行完毕:a的执行上下文从栈顶弹出,其AO无引用则被回收,a的生命周期彻底结束。
  • a弹出后,执行权交回GEC,从之前暂停的位置继续往下执行:最后一行是var d声明,直接跳过,所有全局代码执行完毕,GEC在程序退出前会一直留在栈底。
对你的疑问的针对性解答
  • 关于GEC的执行状态:GEC从进入执行阶段开始,直到所有全局代码执行完毕才会结束,中间调用其他函数时只是暂停执行指针、移交执行权,等栈顶的上下文执行完毕弹出后,会直接回到之前暂停的代码位置继续往下跑,不需要等栈里只剩GEC才恢复执行。另外全局的var d在GEC创建阶段就已经初始化完成,根本不存在“a弹出后再扫描处理d”的操作。
  • 关于你之前理解的执行顺序:“b弹出后处理a的var c、a弹出后处理全局var d”的逻辑完全错误。不管是a里的c、b里的内部d还是全局的d,都是在各自所属上下文的创建阶段就完成了绑定和初始化——哪怕是在b执行的过程中,a的AO里已经存在c: undefined,全局GO里也已经存在d: undefined,不需要等子函数返回再处理。
  • 关于上下文的生命周期:执行上下文从栈顶弹出的那一刻,它的执行阶段就已经完全终止,不存在“持续在后台运行”的情况。变量信息本来就是创建阶段就存在VO/AO上的,执行阶段只做赋值、函数调用这类运行时操作——你给出的示例里所有var变量都没有赋值逻辑,所以创建阶段初始化完成后,执行阶段根本不需要对这些变量做任何额外处理。上下文弹出后,对应的VO/AO如果没有被闭包引用,就会跟着上下文一起被垃圾回收,不会一直驻留内存。

补充细节:b函数内部声明的var d和全局的var d是完全独立的两个变量,分别存储在b的AO和全局GO上,互不影响,b执行完弹出后,内部的d会跟着b的AO一起被回收,和全局的d没有任何关联。

内容的提问来源于stack exchange,提问作者Roma Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:57:19