javascript中闭包嵌套setTimeout时调用栈的情况?
如以下代码:
for (var i = 0; i < 5; i++) {
setTimeout(function timer() {
console.log(i);
}, 1000 * i);
}
个人理解如下:
- 主线程运行代码,调用栈中加入
全局匿名调用函数
。 - 执行
for
循环,遇setTimeout
,将setTimeout
加入event table
注册,当for
循环遍历结束,调用栈中只有最初的全局匿名函数。 - 主线程同步代码执行结束,在调用
task queue
时,调用栈加入timer
函数,一个setTimeout
回调执行结束,取出timer
函数,event loop
循环直到所有运行结束。
又如以下代码:
for (var i = 0; i < 5; i++) {
(function autorun(j) {
setTimeout(function timer() {
console.log(j)
}, j * 1000)
})(i)
}
理解如下:
- 主线程运行代码,调用栈中加入
全局匿名调用函数
。 - 执行
for
循环 - 遇自执行函数
autorun
,将autorun
加入调用栈。 - 将
setTimeout
加入定时器线程。 - 继续执行将
autorun
取出调用栈。 - 继续下一循环,如同3~5执行,只有参数变化。
for
循环执行结束,取出task queue
中的setTimeout
回调函数并执行,此时调用栈有如下图的调用函数。
问:此时调用栈里的autorun
是从哪里出来的,在之前已取出调用栈了?它是否与for循环时的autorun
相同?这里的setTimeout
上下文在调用栈里是如何变化和记录的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论