为什么JS是异步,很有意思,看了袁老师的课,让我醍醐灌顶。
首先呢,JS是一门单线程的语言,它是运行在浏览器的渲染主线程当中,而渲染主线程就只有一个。
而渲染主线程需要做很多的事情,就比如解析HTML,解析CSS,渲染等等任务都会在渲染主线程中去实现。
大家想一想,如果JS是同步的,那会发生什么呢?
看下面这段代码
setTimeout(()=>{console.log(1);},3000)console.log(2);console.log(3);
如果它是同步就会先等待定时器结束,打印顺序就会变成 1 2 3
这会怎么样?
这只是打印数字,如果说我们有一个交互,我要修改DOM的文本,那我是不是要等定时器执行完毕,到了那时候,页面就不会去渲染,它会等待定时器执行完毕再去改变DOM的文本。
好,继续介绍
如果它是同步就会阻塞页面渲染,也就是会阻塞渲染主线程。这时就会导致事件队列当中的任务被堵住。不能被执行。
这样一来就会导致主线程白白消耗时间,还会造成页面无法及时更新的问题,给用户带来卡顿。
所以浏览器采用异步的方式来避免,它会把比如定时器、事件、网络请求等交给其他线程去做,等它们处理好后就会把事先传递的回调函数包装成任务放到事件队列的末尾,等待主线程的调度。
在这种模式下,主线程永远不会阻塞,从而最大程度的保证了单线程的流程运作。
感谢大家的阅读!