1、js是单线程的,这与js最终服务于谁有关。js被浏览器解析渲染网页,使用户可以浏览及与页面发生交互行为。假设将js设计成多线程,用户对同一个DOM节点增加和删除,这是浏览器就蒙圈了,他究竟该听谁的。。。
2、假设没有异步,整个页面逻辑都是同步,及自上而下一步一步的执行。这就会出现一个很恐怖的显现,当上一行解析时间很长,就会导致后面的代码都没有办法执行。
3、异步的原理:事件循环(event loop), 也就理解了js的执行机制。
A、event loop1:将任务分为同步任务和异步任务。
我们非常熟悉的setTimeout,setInterval,promise的回调函数,fech,ajax等都是异步任务。
执行顺序:
1)首先判断js是同步还是异步,若是同步则进入主进程,若是异步则进入event table;
2)异步任务在event table中注册函数,当满足触发条件后,则被推入event queue。
3)同步任务进入主线程就一直执行,直到主线程空闲,则去event queue中查看是否有要执行的异步任务,若有则推入主进程。
B、event loop2:宏任务和微任务
按照以上的分析,当我们遇到settimeout和promise时,就又疑惑了,为什么promise的回调函数会在settimeout之前执行?
这是因为只按照同步和异步划分不准确,准确的划分方式是:
宏任务:包括script、settimeout、setinterval
微任务:promise
执行过程:
1)首先执行宏任务,执行宏任务的过程如果遇到微任务,则将其放入微任务队列
2)宏任务都执行结束,会查看微任务事件队列,并将里面的任务一次执行完
重复上两个步骤,再结合同步和异步就是js的执行机制。
我目前还没有看到这样的总结,我自己总结下:js中的任务首先分为宏任务和微任务两类,每类任务中再分同步任务和异步任务。

网友评论