为什么js是单线程?为什么设置异步?如何实现异步(js执行机制)

2019-11-20  本文已影响0人  lucky_果果

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中的任务首先分为宏任务和微任务两类,每类任务中再分同步任务和异步任务。

人生是一场修行

 

        

上一篇 下一篇

猜你喜欢

热点阅读