
获得徽章 4
- 发现网上很多关于事件循环和宏/微任务的说法是有问题的,文章就不重复写了,澄清一下细节把。
所谓宏任务,是由游览器生成的;所谓微任务,是由JS引擎生成的。生成宿主不同,任务的级别也就不同。类似于操作系统设计了【线程】的概念,但是应用程序设计了【协程】的概念。
宏/微任务其实可以举例为:你在银行柜台办业务,排了一个长队,你们都是【宏任务】,但是轮到你时,你一下子办理了很多事情,比如【转账、办新卡和办信用卡】,这3个事情就是你产生的【微任务】,只有帮你办理完这些,后面那些人才有机会办理业务【宏任务】。
强调一下,有些人可能会以为,只有异步任务才是宏任务,其实并不是如此。比如,script代码、DOM解析这些。
对于游览器的主线程而言,所有任务执行时,最终都是【同步】的,不管你是【延迟】,还是【不延迟】的,最终只有在可以执行时,才会放到【消息队列】,由主线程拉取到执行栈。
在遇到定时器延迟、网络请求时,都是其他线程负责去处理了,消息队列里面这个时候没有它们,只有这些事情异步完成后,才会进入到【消息队列】,然后被拉取执行。
所以,不要把事件循环里面的宏任务和异步与否混在一起了,宏/微代表的只是任务级别,异步/同步代表的是执行时机,对于事件循环这个【死循环】来说,只有现在能执行时,才会进入它的法眼,管你触发是异步还是同步呢,没完成时,不要找我【进消息队列】。
最后,附带一个学习链接:time.geekbang.org。
PS:没有所谓定时器线程,想想也对,主线程完全可以给延迟任务打个时间标记,然后主线程每次根据当前时间进行时间对比检查就是了,和前端localStorage加缓存时间设置一个道理。展开评论6 - 个人主页:
juejin.cn
大家好,我是winter,一个前端技术人。
在过去,我做过嵌入式系统的浏览器开发,带过前端团队,也做过前端架构,现在,我是一名前端领域的教育从业者。
我08年毕业参加工作,至今已经十余年,这段时间我见证了前端职位的发展,也亲身参与了移动前端的发展。在这些年里,我从一个写C++的纯粹的嵌入式工程师,逐步转到了前端领域。我认为前端技术是web的开放、互联和标准化的典型体现,前端是我认同的技术方向。
在从事前端教育领域后,我在从事教育的过程中,对自己过去的技术也做了完整的自我总结,所谓温故而知新,在这个过程中,我自己也有很大的提升。
很高兴能参加此次AMA,大家可以跟我交流「前端技术」、「前端架构」、「前端工程」、「前端教学」、「前端团队管理」、「浏览器」等话题,当然了,AMA其实就是问什么都可以啦!
我会在 2021年1月25日-1月29日(共5天)之间,选择其中的问题回答。在活动结束之后,我会选出一个最佳问题(与技术、职场或个人发展相关),该提问者能够获得掘金送出的精美周边。展开10742