重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
JS是单线程的,也就是,同一时间只能做一件事情。所以一旦遇到大量任务或者耗时的任务时,比如加载高清图片,网页就会“假死”,无法响应用户的行为。为了防止这种阻塞,才有了同步和异步的概念。而EventLoop,即事件循环机制,就是我们经常使用异步的原理。
创新互联建站是专业的沧源网站建设公司,沧源接单;提供成都网站制作、网站设计、外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行沧源网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
console.log('111')
console.log('222')
console.log('333')
上述就是简单的同步任务,会按照顺序输出111,222,333
比如说发一个网络请求,主程序需要等到接收到数据后再去做其他的事情。当异步完成后,可能程序正在做其他的事情,所以即使异步完成了也需要在一旁等待,等到程序空闲下来才有时间继续执行。
异步任务分为宏任务和微任务。
为了防止一个函数执行时间过长阻塞后面的代码:
每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)
浏览器为了能够使得JS内部宏任务与DOM任务能够有序的执行,会在一个宏任务执行结束后,在下一个宏任务执行开始前,对页面进行重新渲染。所以宏任务执行是在DOM渲染之后。
宏任务包括:
微任务就是在当前任务结束之后立即执行的任务。微任务在渲染之前执行,所以它的响应速度相比宏任务会更快,因为无需等渲染。
微任务包括:
根据上述的解释,先来判断一下这段代码的输出结果
setTimeout(function(){
console.log('1')
})
new Promise(function(resolve){
console.log('2')
resolve()
}).then(function(){
console.log('3')
})
console.log('4')
正确的输出结果是:2431
执行的过程:
①先执行所有的同步任务(第5行、第10行)
②再执行微任务(第8行,promise.then是微任务)
③在执行下一个宏任务(第2行,setTimeout是宏任务)
再看一个复杂的例子
console.log('1');
setTimeout(() => {
console.log('2');
new Promise(function(resolve) {
console.log('3')
resolve()
}).then(function() {
console.log('4')
})
})
new Promise(function(resolve) {
console.log('5')
resolve()
}).then(function() {
console.log('6')
})
setTimeout(() => {
console.log('7')
new Promise(function(resolve) {
console.log('8')
resolve()
}).then(function() {
console.log('9')
})
})
输出的结果为:
需要注意的点就是执行完每个宏任务,都会把微任务队列中的执行完,才能再执行下一个宏任务