-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JS eventLoop #9
Comments
一直以为浏览器的事件循环机制就是执行栈加任务队列,直到我看到一篇译文,才觉得事件循环机制博大精深,并顺便把nodeJS eventLoop也了解清楚,这对于我们后期编写复杂的异步逻辑很有帮助。 本文将尽可能深入地介绍浏览器中的JS eventLoop以及nodeJS eventLoop,先向参考的文章致敬。
JS eventLoop单线程js是单线程的,但浏览器内核是多线程,在内核控制下各线程相互配合以保持同步,一个浏览器通常由以下常驻线程组成:
需要注意的是主线程和GUI线程是互斥的,表现为耗时长的同步脚本是会使页面出现卡顿的;页面频繁的回流重绘也会导致交互出现延迟。 执行栈、任务队列、事件循环所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 简言之,执行栈就是执行同步任务的容器�,任务队列就是异步任务的回调函数存放的地方,事件循环就是主线程从任务队列中取任务,放置到执行栈中执行,并且不断地循环此过程。这么说可能有些枯燥,请看下图:
没那么简单的任务队列我一直认为任务队列只有一条,只要是异步任务的回调函数,就推入任务队列就是了,直到我了解了microTask和macroTask。
microTask和macroTask各自涉及的操作如下:
这么说可能有些晦涩难懂,我们直接分析一串代码的实际执行结果:
解析如下:
按照如上分析,执行结果应该是:
实际结果之所以与理想结果不符,是因为不同浏览器的事件循环机制是会由差别的,这个差别我还没有做深入分析,这一部分待续...
|
No description provided.
The text was updated successfully, but these errors were encountered: