前言大家好,我是梁木友,一个有思想的前端。JavaScript的知识点真是层出不穷,今天就来了解一下JavaScript的运行机制。JavaScript单线程机制JavaScript是单线程语言,就注定了它一次只能做一件事,只能从上到下执行,所以如果上一行的解析时间很长,下面的代码会被屏蔽掉,这样对用户体验很不友好。所以JavaScript有同步任务和异步任务。JavaScript事件循环同步程序的执行顺序与任务顺序一致同步。比如烧水煮饭,需要等水烧开,然后异步煮饭。在这样做的同时,您还可以处理其他事情。一边烧水,一边切菜,看看同步任务和异步任务的执行过程先来看一个问题setTimeout(()=>{console.log('setTimeout')})newPromise((resolve)=>{console.log('promise')resolve()}).then(()=>{console.log('then')})console.log('console')根据上面,然后执行result应该是promiseconsolesetTimeoutthen哦不对,和实际输出不符。PromiseconsolethensesetTimeout宏任务和微任务我们知道,虽然都是异步任务,但是promise和setTimeout是不同的异步任务。异步任务有两种宏任务(script、setTimeout、setInterval、Ajax、UI渲染、I/O、postMessage等)微任务(promise、process.nextTick)不同的任务也会进入不同的队列,所以会执行异步任务时也会进入不同的事件队列,要理解为什么输出的结果是promiseconsolethensetTimeout事件循环,我们结合它来看一下整体的事件循环机制异步任务分类总结:宏任务,微任务同步任务和异步任务进入不同的执行“地方”,执行主线程executionstackfirst如果在宏任务执行过程中遇到微任务,则进入事件表并注册该函数。完成后,会被移动到微任务的任务队列中。macrotask执行完后,会立即执行当前microtask队列中的所有microtasks(按顺序)主线程会不断获取任务队列中的任务,执行任务,再次获取任务,再次执行任务,这通常被称为事件循环(eventloop)。
