标签:代码执行 src https observer The new style art 过程
JS是单线程的,每次只能做一件事情。像以下这种情况,代码会按顺序执行,这个就叫同步。
console.log(1); console.log(2); console.log(3);
以下代码会输出2、3、1,像这种不按顺序执行的,或者说代码执行中间有时间间隙的,叫异步。
setTimeout(() => { console.log(1); }, 0); console.log(2); console.log(3);
一个浏览器通常有以下几个常驻的线程:
渲染线程和JS引擎线程是不能同时进行的。也就是说在执行代码时,渲染会挂起;渲染DOM时,代码也不会执行。 虽然JS是单线程,但是浏览器是多线程的,在遇到像setTimeout、DOM事件、ajax等这种任务时,会转交给浏览器的其他工作线程(上面提到的几个线程)执行,执行完之后将回调函数放入到任务队列。
// eventLoop是一个用作队列的数组 // (先进,先出) var eventLoop = [ ]; var event; // “永远”执行 while (true) { // 一次tick if (eventLoop.length > 0) { // 拿到队列中的下一个事件 event = eventLoop.shift(); // 现在,执行下一个事件 event(); } }
我们可以用上面的代码来想像一下JS的执行情况。
JS主线程,就像是一个while循环,会一直执行下去。在这期间,每次都会查看任务队列有没有需要执行的任务(回调函数)。在执行完一个任务之后, 会继续下一个循环,直到任务队列所有任务都执行完为止。
任务队列又分微任务队列和宏任务队列
也就是说执行微任务队列 会将队列中的所有微任务执行完 而执行宏任务队列 每次只执行一个宏任务 然后重新开始下一个循环 我们可以看看以下代码
setTimeout(() => { console.log(3) new Promise((resolve, reject) => { console.log(5) resolve() }).then(console.log(6)) }, 0) setTimeout(() => { console.log(4) }, 0) new Promise((resolve, reject) => { console.log(1) resolve() }).then(console.log(2))
输出是1 2 3 5 6 4
我们来分析一下代码的执行过程
标签:代码执行 src https observer The new style art 过程
原文地址:https://www.cnblogs.com/woai3c/p/10247915.html