setTimeout被调用时是否会被添加到调用栈(call stack)中?
结论
setTimeout在JS引擎执行到它的调用语句的瞬间,会被加入调用栈(call stack)。
具体执行逻辑说明
- 所有JS环境中被同步调用的函数/方法,都会在调用触发时先被推入调用栈,
setTimeout作为运行时(浏览器/Node.js)暴露给JS的全局原生方法也遵循这个规则。 - 完整的定时器执行流程如下:
- 同步代码执行到
setTimeout(回调函数, 延时时间)调用行时,setTimeout调用被推入调用栈 - JS引擎执行该
setTimeout调用:通知对应的Web API(定时器模块)注册这个延时任务,同时将传入的回调函数交给Web API保管 - 注册动作完成后,
setTimeout会被立即弹出调用栈,后续的同步代码继续正常执行 - 等到设定的延时时间到期、且当前调用栈完全为空时,定时器对应的回调函数才会被任务队列推到调用栈中执行
- 同步代码执行到
示例代码调用栈变化参考
function add(a, b) { return a + b } console.log('开始') setTimeout(() => { console.log('定时器回调执行') }, 1000) console.log(add(1,2)) console.log('结束')
对应调用栈变化顺序:
- 全局执行上下文入栈
console.log('开始')入栈,执行完成后弹出setTimeout(...)入栈,完成定时器注册后弹出add(1,2)入栈,计算完成返回结果后弹出console.log(3)入栈,执行完成后弹出console.log('结束')入栈,执行完成后弹出- 全局执行上下文出栈,调用栈为空
- 1秒延时结束后,定时器回调函数入栈,执行完成后弹出
内容的提问来源于stack exchange,提问作者j obe
相关产品推荐
相关产品推荐

