关于setTimeout的全局执行上下文(GEC)行为疑问
全局执行上下文在setTimeout循环中的生命周期疑问
代码示例
function perpetuity() { console.log("Being called"); setTimeout(perpetuity, 1500); } perpetuity();
疑问
这段代码执行时,调用栈中是否始终存在全局执行上下文(GEC)以支持代码运行?还是每1500毫秒,全局执行上下文会随回调函数的执行上下文一同创建和销毁?ChatGPT称GEC不会终止,但我在浏览器调用栈中无法找到它。
解答
全局执行上下文(GEC)从页面加载完成后就会一直存在,直到页面被关闭,不会随setTimeout的回调执行而创建或销毁。
为什么浏览器调用栈里看不到GEC?
浏览器开发者工具的调用栈面板,只会展示当前正在执行的函数执行上下文,GEC作为支撑整个页面的底层全局环境,不会被显示在这个面板中,但它确实一直存在于内存里,负责维护全局变量、window对象等核心全局环境。
结合代码的执行流程拆解
- 页面加载完成后,GEC被创建并进入调用栈,主代码开始执行:
- 声明
perpetuity函数,然后调用它,此时perpetuity的执行上下文被压入调用栈,栈结构为[GEC, perpetuity执行上下文]。 - 执行
console.log,然后调用setTimeout,将perpetuity注册为1500ms后的回调,随后perpetuity的执行上下文出栈。 - 主代码执行完毕,此时调用栈清空,但GEC依然留在内存中,不会被销毁。
- 声明
- 1500ms后,事件循环将
perpetuity的回调推入微任务队列,随后进入调用栈执行:- 此时调用栈中只有
perpetuity的执行上下文,执行完代码后再次注册setTimeout,然后上下文出栈,调用栈回到空状态。 - 整个过程中,GEC始终在后台维持全局环境,从未被销毁或重建。
- 此时调用栈中只有
简单来说,GEC是页面的"基础环境",只要页面没关它就一直在,调用栈里看不到只是因为工具不展示这个底层环境而已。
内容的提问来源于stack exchange,提问作者Soumya Sagnik Khanda
相关产品推荐
相关产品推荐

