js执行任务流程最详细讲解
一、JS是单线程
JS语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。
这样所导致的问题是:
如果JS执行的时间过长,这样会造成页面的渲染不连贯,导致页面渲染加载阻塞
二、同步和异步
为了解决这个问题,利用多核CPU的计算能力,HTML5提出了Web Worker标准,允许JS脚本创建多个线程,于是,jS中出现了同步和异步
同步:前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的,同步的。比如:我们要烧水煮饭,等水开了(10分钟后),再去切菜,炒菜
异步:你在做一件事情时,因为这件事会花费很长时间,在做这件事的同时,你还可以去处理其他事情。比如烧水的10分钟内,去切菜,炒菜
同步任务:在主线程上排队执行任务,只有前一个任务执行完毕,才能执行后一个任务
异步任务:不进入主线程,而是进入"任务队列"的任务
一般而言,异步任务有以下四种类型
1、setTimeout和setlnterval
2、DOM事件 普通事件如:click、resize,资源加载事件:onload等
3、ES6中的Promise
4、Ajax异步请求
异步任务相关回调函数添加到任务队列中(消息队列)
image三、任务队列里面又分为宏任务与微任务
常见的 微任务
有 MutationObsever 、 Promise.then 、$nextTick
常见的 宏任务
有 setTimeout、MessageChannel、postMessage、setImmediate;
因为promise.then $nextTick()是个微任务,setTimeout是个宏任务,所以先输出promise。
接下来我们看如下代码,看起来有点复杂,但是我们记住一个原则,“先执行同步代码,再执行微任务,最后执行宏任务”,这样就会清晰很多'
image image