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

setTimeout被调用时是否会被添加到调用栈(call stack)中?

结论

setTimeout在JS引擎执行到它的调用语句的瞬间,会被加入调用栈(call stack)。


具体执行逻辑说明

  • 所有JS环境中被同步调用的函数/方法,都会在调用触发时先被推入调用栈,setTimeout作为运行时(浏览器/Node.js)暴露给JS的全局原生方法也遵循这个规则。
  • 完整的定时器执行流程如下:
    1. 同步代码执行到setTimeout(回调函数, 延时时间)调用行时,setTimeout调用被推入调用栈
    2. JS引擎执行该setTimeout调用:通知对应的Web API(定时器模块)注册这个延时任务,同时将传入的回调函数交给Web API保管
    3. 注册动作完成后,setTimeout会被立即弹出调用栈,后续的同步代码继续正常执行
    4. 等到设定的延时时间到期、且当前调用栈完全为空时,定时器对应的回调函数才会被任务队列推到调用栈中执行

示例代码调用栈变化参考

function add(a, b) {
  return a + b
}

console.log('开始')
setTimeout(() => {
  console.log('定时器回调执行')
}, 1000)
console.log(add(1,2))
console.log('结束')

对应调用栈变化顺序:

  1. 全局执行上下文入栈
  2. console.log('开始')入栈,执行完成后弹出
  3. setTimeout(...)入栈,完成定时器注册后弹出
  4. add(1,2)入栈,计算完成返回结果后弹出
  5. console.log(3)入栈,执行完成后弹出
  6. console.log('结束')入栈,执行完成后弹出
  7. 全局执行上下文出栈,调用栈为空
  8. 1秒延时结束后,定时器回调函数入栈,执行完成后弹出

内容的提问来源于stack exchange,提问作者j obe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:36:03