单线程:
首先,JS是单线程的语言,顾名思义,整个的任务都在一条线上,一个任务执行完了,下一个任务才能执行。所以对于JS来说,它自己是不可能是异步的。
异步:
但是JS的宿主环境,比如浏览器是多线程的,浏览器会通过事件驱动的方式,让JS能够进行异步执行,从而达到单线程进行异步执行的效果。
为什么JS要做到异步执行?
因为js里面的网络请求,定时器事件以及事件监听等事件,会消耗大量的时间,如果JS进行单线程执行,如果这些操作一直在浪费时间,就会导致整个页面无法往下执行,页面假死等情况,所以针对此类情况,浏览器为这些耗时较长时间的任务另外开辟了新的线程,所以这些任务都是异步的。
JS主线程如何知道异步任务要进行执行或者是执行完成要进入到队列中呢?
这也就是我们上文说的事件驱动的方式,
setTimeout(function(){
console.log('come');
},50);
执行这段代码的时候,浏览器执行异步操作,等到50毫秒之后,会触发事件驱动(定时器事件),定时器里面的回调函数会进入到JS主线程的任务队列中。所以说JS是单线程的,浏览器让JS实现了异步。
主线程:
如图