众所周知,js是单线程的,但是我们又经常说js异步,这是为什么呢?
实际上浏览器的渲染过程是多线程的,它不只有js一个线程,它还有GUI渲染线程、事件触发线程、定时触发器线程、异步http请求线程等线程
js一次只能执行一个任务,当他有许多任务时,由于单线程,所以这些任务只能形成一个任务队列排队一个一个来,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的
所以说js单线程和异步并没有什么关系。
举个例子
setTimeout(function(){
console.log(1);
},0);
console.log(2);
输出是 2 1
我们来分析一下过程,js在执行时,首先要查看当前任务队列中有没有任务,从上到下,首先遇到定时器,浏览器会开启一个定时器线程,继续往下,console.log(2),放入队列,当定时器进程执行完后,推入到队列中,然后开始执行,输出2, 1,这就是所谓的异步。