在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
下面一道关于宏任务和微任务的题: setTimeout(function(){ console.log('1') }); new Promise(function(resolve){ console.log('2'); resolve(); }).then(function(){ console.log('3') }); console.log('4') 试问一下上面代码的执行顺序是啥?
估摸着是这么想的:我难道不知道js是一行一行执行的, 我有点慌,于是我粘贴到浏览器去瞅两眼: 无法相信 带着困惑的我,只能去好好研究研究JavaScript的运行机制了! 1、关于JavaScript
2、JavaScript事件循环既然js是单线程,那就像只有一个窗口的食堂,学生需要排队一个一个打饭,同理js任务也要一个一个顺序执行。这种模式执行简单,但随着日后的需求,事务,请求增多,这种单线程模式执行效率必定低下。只要有一个任务执行消耗了很长时间,在这个时间里后面的任务无法执行。 常见的有新闻包含的超清图片加载很慢,难道我们的网页要一直卡着直到图片完全显示出来?为了解决这个问题,JavaScript语言将任务执行模式分成同步和异步:
导图要表达的内容用文字来表述的话:
再配上代码表达: let data = []; $.ajax({ url:blog.csdn.net, data:data, success:() => { console.log('发送成功!'); } }) console.log('代码执行结束'); 上面是一段简易的ajax请求代码:
相信通过上面的文字和代码,你已经对js的执行顺序有了初步了解。然而这也是为什么会有小伙伴回答2,4,1,3的原因。 然而实际上,异步队列里是还有门道的,我们那道面试题, 3、宏任务和微任务每个人的理解方式不同,因为宏任务和微任务并不是标准,但执行的顺序在js中是大一统了的。 宏任务:
微任务:
宏任务包括:<script>整体代码、 process.nextTick差异太大,不同的node执行不统一,不做标准 Tip:有些人喜欢将<script>整体代码放在宏任务里,但我个人不喜欢,在我这里它只是第一执行的主线程,我个人是将宏任务和微任务都归类到异步任务里! 我们再来看看那道面试题: //回调才是异步任务 setTimeout(function(){//宏任务 console.log('1') }); new Promise(function(resolve){ console.log('2');//同步主线程 resolve(); }).then(function(){//微任务 console.log('3') }); console.log('4')//同步主线程
因此:2,4,3,1的结果就出来了! 除此我们来拓展一下: setTimeout(() => {//宏任务队列1 console.log('1');//宏任务队1的任务1 setTimeout(() => {//宏任务队列3(宏任务队列1中的宏任务) console.log('2') }, 0) new Promise(resolve => { resolve() console.log('3')//宏任务队列1的任务2 }).then(() => {//宏任务队列1中的微任务 console.log('4') }) }, 0) setTimeout(() => {//宏任务队列2 console.log('5') }, 0) console.log('6')//同步主线程
以上代码会怎么输出呢? 4、拓展宏任务微任务上面出了复杂的题,小伙伴们不妨可以想一想,这种复杂情况,一个套一个的该怎么执行呢?
经过验证,结果正确! 到此这篇关于浅谈js中的宏任务和微任务的文章就介绍到这了,更多相关js中的宏任务和微任务内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论