setTimeout 等待时间发生在哪里?

image.png
我的理解是:setTimeout 属于异步操作,当同步代码执行完毕后等待 2 秒后执行异步操作,然后看图里的文档就感觉很奇怪,等待发生在其他地方,难道是我理解错了?

阅读 3.3k
3 个回答

1.你的理解:“setTimeout 属于异步操作,当同步代码执行完毕后等待 2 秒后执行异步操作”
答:其实不是这样的,并不是同步代码执行完毕后,再等待2秒,再执行异步代码,而是执行同步代码的时候,同时开启2秒等待,最终当同步代码执行完毕后,再看下是否可以执行异步代码了。比如同步代码执行耗时了500ms,定时器这个时候也已经等待了500ms,那么定时器的异步代码就会在剩余1500ms后执行。

2.截图描述:“等待发生在其他地方”
答:这里其实是他描述方式+你的异步知识缺漏造成了误导和理解偏差。“等待发生在其他地方”,就是说定时器的计时等待在主线程之外,也就是游览器提供的特定io线程上,这个线程计时完成后,会把定时器回调代码作为消息丢到消息队列,然后主线程拉取执行,前提是主线程已经执行完毕(也就是所谓同步代码已执行完毕)。

提供一个js异步测试代码的东西给你(打开有点慢):http://latentflip.com/loupe

这个理解你问问这篇文章的作者吧,他可能的意思是,你 setTimeout 之后,后面的代码不必等待就继续往下执行,而 setTimeout 里面的代码需要等待设定的时间后才执行?不过我觉得你截图的这个理解有问题的,他没有说清楚浏览器异步同步的原理很容易误导别人的。还有你的这句话理解有误的:“当同步代码执行完毕后等待 2 秒后执行异步操作”,我试过,如果一个同步代码执行超过设定的 time 时间,当同步代码执行完成后会立即执行 setTimeout 里面的函数的。

只是一种写作手法,说明作者在前面已经表述过了,你可以再回头看看文章的前几段。
也可看看这个JS-异步编程-EventLoop

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题