初面网初面网

事件循环

为了防止多线程可能造成的混乱(例如,线程1修改了一段文字,但线程2删除了整段内容),所以js被设计成单线程

但为了能够不阻塞用户操作, 又需要一种能够暂时脱离单线程的方法

var box = document.getElementById('box');
box.onClick = function(){
    alert(1111);
}
// 按理来说程序是一行行执行,当上面的这个点击事件未执行时下面的不应输出
// 但点击事件是不确定的,所以就需要机制能够让点击事件暂时超脱于"一行行执行"这个规则
console.log(222);

同步的执行完才进入事件循环。进入事件循环的有:请求、定时器、事件

  • 宏任务

setTimeout、setInterval、requrestNimationFrame

宏任务队列可以有多个

  • 微任务

new Promise().then()、process.nextTick()

微任务队列只有一个

  • 循环规则
  1. 微任务执行

  2. 在所有微任务完成后,如果有宏任务,则执行宏任务

  • 总结流程

所以,整个js的流程是:

同步=>事件循环(微任务=>宏任务=>微任务...)=>同步=>事件循环=>...

  • 例题

例题一

for(var i = 0; i< 3; i++){
    setTimeout(function(){
        console.log(i);
    },1000*i);
}

例题二

setTimeout(function(){
    console.log('1')
})

new Promise((resolve)=>{
    console.log('2')
    resolve();
}).then(()=>{
    console.log('3')
}).then(()=>{
    console.log('4')
})

console.log(5)

更新于 2025/2/26