JavaScript是单线程。
单线程原因
- 为了避免复杂性,浏览器脚本语言的优势
作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM,假如使用多线程在同一时间点对DOM进行增删操作,浏览器无法分辨以哪个进程为准。
为什么有同步任务与异步任务之分
提高GPU的利用效率
js任务执行
js中的同步任务会在主线程按照顺序执行,异步任务会进入任务队列,在主线程会形成一个执行栈,主线程中的任务执行完毕后,会在任务队列中去查看事件,将异步任务放入执行栈,开始执行。
事件循环EventLoop
主线程从任务队列中读取事件,这个过程是不断循环的,因此这个运行机制称为Event Loop
异步任务又分为宏任务(macrotask)和微任务(microtask),那么任务队列就有了宏任务队列和微任务队列,微任务总是在宏任务之前执行,也就是说:同步任务>微任务>宏任务,
宏任务&微任务.png
js代码执行流程
总结
- 宏队列macrotask一次只从队列中取一个任务执行,执行完后就去执行微任务队列中的任务;
- 微任务队列中所有的任务都会被依次取出来执行,知道microtask queue为空;
- 图中没有画UI rendering的节点,因为这个是由浏览器自行判断决定的,但是只要执行UI rendering,它的节点是在执行完所有的microtask之后,下一个macrotask之前,紧跟着执行UI render。
网友评论