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

setTimeout递归流程异常:为何'11111111'语句会执行?

问题解释:为什么'11111111'会执行,且出现无限循环

先理清楚代码的执行流程,就能明白这两个现象:

为什么'11111111'会执行?

第一次调用outer()时,会执行到inner(5000),inner里设置了一个5秒后触发的定时器。5秒后,定时器的回调函数开始执行:

  • 首先同步调用outer(),这个调用会完整执行完(打印'in outer'、调用inner打印'in inner'、设置新的定时器)——因为JavaScript是单线程的,同步代码会优先执行完才会处理后续逻辑。
  • 等新的outer()执行完毕后,回调里的后续代码console.log('11111111')就会执行,所以这行日志会被打印出来。

为什么会出现无限循环?

每次定时器触发时,都会调用一次outer(),而每次outer()执行时,又会调用inner()创建一个新的5秒定时器。这样就形成了循环:旧定时器触发→调用outer()→创建新定时器→新定时器触发→再调用outer()→再创建新定时器……不断往复,没有终止条件,所以会无限循环下去。

这里要注意,这不是传统的同步死循环(不会直接卡死主线程),而是不断产生新的异步定时器任务,属于异步层面的无限递归调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:30:54