我的理解是:setTimeout 属于异步操作,当同步代码执行完毕后等待 2 秒后执行异步操作,然后看图里的文档就感觉很奇怪,等待发生在其他地方,难道是我理解错了?
我的理解是:setTimeout 属于异步操作,当同步代码执行完毕后等待 2 秒后执行异步操作,然后看图里的文档就感觉很奇怪,等待发生在其他地方,难道是我理解错了?
这个理解你问问这篇文章的作者吧,他可能的意思是,你 setTimeout 之后,后面的代码不必等待就继续往下执行,而 setTimeout 里面的代码需要等待设定的时间后才执行?不过我觉得你截图的这个理解有问题的,他没有说清楚浏览器异步同步的原理很容易误导别人的。还有你的这句话理解有误的:“当同步代码执行完毕后等待 2 秒后执行异步操作”,我试过,如果一个同步代码执行超过设定的 time 时间,当同步代码执行完成后会立即执行 setTimeout 里面的函数的。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
1.你的理解:“setTimeout 属于异步操作,当同步代码执行完毕后等待 2 秒后执行异步操作”
答:其实不是这样的,并不是同步代码执行完毕后,再等待2秒,再执行异步代码,而是执行同步代码的时候,同时开启2秒等待,最终当同步代码执行完毕后,再看下是否可以执行异步代码了。比如同步代码执行耗时了500ms,定时器这个时候也已经等待了500ms,那么定时器的异步代码就会在剩余1500ms后执行。
2.截图描述:“等待发生在其他地方”
答:这里其实是他描述方式+你的异步知识缺漏造成了误导和理解偏差。“等待发生在其他地方”,就是说定时器的计时等待在主线程之外,也就是游览器提供的特定io线程上,这个线程计时完成后,会把定时器回调代码作为消息丢到消息队列,然后主线程拉取执行,前提是主线程已经执行完毕(也就是所谓同步代码已执行完毕)。
提供一个js异步测试代码的东西给你(打开有点慢):http://latentflip.com/loupe