前言
浏览器渲染进程有多个线程,GUI渲染线程,JS引擎线程,事件触发线程,定时器触发线程,异步http请求线程。JS是单线程工作的,同一个时间内只有一段js代码在运行。
js线程跟gui渲染线程是互斥的,当js引擎执行的时候,会将gui渲染线程挂起。如果js引擎执行一段耗时的代码,会阻塞gui进程渲染。因此提出了异步的概念,异步任务又分为宏任务和微任务。
同步任务在主线程上进行形成执行栈,当异步任务有结果时放在异步队列中,当同步任务执行结束,去异步队列中将任务提取到执行栈中执行,如此反复的过程,就称为事件循环。
宏任务
setTimeout,setInterval,ui渲染,script代码块
微任务
fetch,promise.then
JS线程阻塞UI线程
当js执行耗时操作,界面会卡死。此时可以采用一种技术webworker开一个新的线程,去跑耗时操作。