单线程,event-loop,异步,promise,async await 这些名词在js中经常被提及。然而他们之间有什么关系呢,通过这段时间的学习,又有了进一步的了解,特用该篇文章记录一下。
单线程指什么?就是指同一时间,只能做一件事,两段JS不能同时执行。
为什么会有单线程?避免DOM渲染冲突。
解决方案是什么?异步,eventl-loop。
那异步的解决方案是什么?如jquery Defrred,Promise,async await都是异步的解决方案。
后端的一些语言中可以起多个线程或者多个进程,给它们分配代码同时执行。可是在前端中只能有一个线程。为什么呢?首先,1. 浏览器需要渲染DOM; 2. JS可以修改DOM;3. JS执行的时候,浏览器DOM渲染会暂停; 4. 两段JS也不能同时执行(都修改DOM就冲突了),综上4条得知,前端执行JS职能是单线程,而且JS的执行和浏览器的渲染只能共用一个线程。(html5中有webworker支持多线程,但是也有个条件,不能访问DOM)
如果没有异步,JS执行的效率是非常慢的。比如遇见setTimeout、setInterval、ajax、addEventListener等这些异步的操作总不能一直卡在那,必须要有解决方案,那就是异步,保证等待的时间也能执行代码,异步和event-loop机制,保证JS能够比较高效的运行。
随着异步解决了单线程这个问题,异步本身也出现问题,
问题一:没按照书写方式执行,可读性差;
问题二:callback中不容易模块化。
event-loop,即事件轮询,是JS实现异步的具体解决方案。同步代码,直接执行;异步函数先放在 异步队列 中;待同步函数执行完毕, 轮询执行 异步队列 的函数。(v8引擎做的,太底层了。。。)
后面的几篇将从deferred 开始,到promise,再到async await。
网友评论