一,浏览器的异步实现原理
首先JS是一门脚本语言,他的执行顺序是从上到下逐行执行的,浏览器只有一个javascript引擎,所以浏览器同时只能执行一个任务。即浏览器的javascript引擎是单线程的,但是浏览器本身是多线程的。
JavaScript代码可以异步执行,但并不意味着它是跑在多个线程里。那么异步到底是什么意思?
假设浏览器是同步执行的话,发送一个Ajax请求,向服务端请求数据,Ajax请求会冻结住,不让后面的代码执行,直到收到服务端的响应,就会造成阻塞。
实际上,你并不是立即得到响应——你需要等待一小段时间,让服务端返回数据。在等待响应的过程中,程序运行着你其他部分的代码。这个便是异步。
JS引擎在解析代码的时候,遇到settimeout和setInterval或者ajax会把它们先放进任务队列里面,先执行剩下在主栈列内的代码。在执行完主栈列的代码后,并不会马上去任务队列内找任务放到主栈列,而是先查找刚刚是不是有需要渲染引擎,如果有的话就会切换渲染线程。之后才会去查找队列任务,采取的是轮询机制,ajax比settimeout和setInterval优先级高。