js是单线程的,为了让耗时代码不阻塞其他代码运行,设计了事件循环模型
执行过程
image.png
1.执行同步代码,遇到异步代码交给宿主环境执行
2.异步代码在宿主环境执行完时,其回调函数放入任务队列排队
3.调用栈空闲时,调用栈循环反复的调用任务队列里的回调
console.log(1) // 1.调用栈执行1
// 2.异步,给宿主,倒计时0,回调函数在任务栈排队
setTimeout(() => {
console.log(2)
}, 0)
function myFn() {
console.log(3)
}
function ajaxFn() {
const xhr = new XMLHttpRequest()
xhr.open('GET', 'http://hmajax.itheima.net/api/province')
xhr.addEventListener('loadend', () => {
console.log(4)
})
xhr.send()
}
//3.for循环,调用栈执行5
for (let i = 0; i < 1; i++) {
console.log(5)
}
//4.函数内异步,宿主环境,请求完后,回调在任务队列排队
ajaxFn()
//5.宿主监听 单击事件 document.addEventListener('click', () => {
console.log(6)
})
//6.调用栈执行
myFn()
同步执行完,1 5 3
读任务队列,2
反复读,4
// 1 5 3 2 4 点击一次document就会执行一次打印6