js执行机制
javascript是单线程语言,所以javascript是按照语句出现的顺序执行的。既然javascript是单线程语言,那么js任务也要一个一个顺序执行。如果一个任务耗时过长,那么后一个任务也必须等着。这样不利于开发,所以需要将任务分为两类:1、同步任务;2、异步任务;
这张图片告诉我们:
1、分清楚什么是同步任务、哪个是异步任务,同步任务和异步任务进入不同的场所,同步任务进入主流程栈中,异步的进入Event Table并注册函数。
2、一旦异步任务指定的事情完成过后,其对应的回调函数移入Event Queue。
3、主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行
4、上述过程会不断重复,也就是常说的Event Loop(事件循环)(事件循环根据判断宏任务是否执行结束)
例子1:
let data = [];
$.ajax({
url:www.javascript.com, data:data, success:() => { console.log('发送成功!'); }
})
console.log('代码执行结束');
分析:
1、ajax进入Event Table,注册回调函数success
2、ajax是异步任务,同步任务console.log('代码执行结束')会挂到主线程上执行。
3、ajax事件完成,回调函数success进入Event Queue。
4、主线程为空过后,主线程从Event Queue读取回调函数success并执行
这张图告诉我们:
1、我们对任务有更精细的定义:
macro-task(宏任务):包括整体代码script,setTimeout,setInterval
micro-task(微任务):Promise,process.nextTick
不同类型的任务会进入对应的Event Queue,比如setTimeout和setInterval会进入相同的Event Queue。
2、进入整体代码(宏任务)(同步任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务
作者:ssssyoki
链接:https://juejin.im/post/59e85e...
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。