js是单线程
js作为浏览器的脚本语言,主要是实现用户与浏览器的交互,以及操作dom。
进程与线程
进程:是cpu分配资源的最小单位。
线程:是cpu调度的最小单位。(线程是建立在进场的基础上的一次程序运行单位,一个进程中可以有多个线程)
浏览器是多进程的吗?
在浏览器中,每打开一个tab页面,其实就是打开了一个新的进程,在这个进程中,有ui渲染线程,js执行线程,http请求线程。
宏微队列及执行顺序
异步任务又分为 宏任务 和 微任务,不同的API注册的任务会依次进入自身对应的队列中,然后等待 Event Loop将它们依次压入执行栈中执行。
宏任务
script表情(整体代码), setTimeout, setInterval, postMessage
微任务
promise.then
Event Loop 事件循环
执行过程如下:
-
执行栈选择最先进入 异步队列的宏任务(通常是script整体代码),如果有则执行
-
检查是否存在微任务,如果有,则会清空微任务队列
-
更新render
-
重复上面的步骤,直到异步队列为空
来个例子?
javascript
// 执行顺序问题,考察频率挺高的,先自己想答案**
setTimeout(function () {
console.log(1);
});
new Promise(function(resolve,reject){
console.log(2)
resolve(3)
}).then(function(val){
console.log(val);
})
console.log(4);
我们来解析一下是怎么运行的。
- 先执行 script 同步代码
先执行 new Promise中的 console.log(2) 和 console.log(4).
Promise中包裹的函数是同步执行的。
2.执行完 script 宏任务后,执行微任务,console.log(3), 微任务队列为空
- 执行一遍宏任务, 定时器,console.log(1)