JS中的进程、线程、任务队列、事件循环、宏任务、微任务、执行栈等概念理解JS中的进程、线程、任务队列、事件循环、宏任务、微任务、执行栈等概念有很多概念需要了解javascript,尤其是标题中列出的那些。今天我们就来了解一下这些概念。1.进程与线程浏览器的每个标签页都可以看作是一个浏览器内核进程。每个进程下,都会有多个线程相互配合完成任务,比如GUI线程、JS引擎线程、网络线程、定时器线程等。2.任务队列任务队列可以看成是交换任务一一个。当主线程的任务完成后,会执行任务队列中的任务(如果当前任务队列中加入了新的异步任务,其回调函数会在后续任务队列中释放)3.之后事件循环异步任务执行时,其回调将被放入任务队列中。当主线程任务执行完毕后,去任务队列中取出下一个要做的任务,放到主线程中执行,直到任务全部结束。如果没有新的任务要做,浏览器处于等待状态,知道新的外部输入和事件触发。这样的循环过程称为事件循环。4、宏任务和微任务任务队列中有两种任务,一种是宏任务,一种是微任务。具体的概念我没找到,不过可以这么理解。微任务是当前主线程任务执行完后立即执行的任务,宏任务是在下一个事件循环中放入主线程的任务。.一般的宏任务包括setTimeout和setInterval,而微任务包括promise、process.nextTick等。5.执行栈执行栈是解释器跟踪函数执行流程的一种机制。当引擎第一次遇到js代码时,会生成一个全局的执行上下文,压入执行栈。每次遇到函数调用时,它都会将一个新的上下文压入堆栈。引擎执行完栈顶函数后,弹出当前执行上下文,直到函数顺序执行完毕,返回全局上下文。有兴趣测试的同学可以试试下面代码的输出顺序setTimeout(function(){console.log('1')});newPromise(function(resolve){console.log('2');resolve();}).then(function(){console.log('3')setTimeout(function(){console.log('5')});});console.log('4');遇到第一个settimeout,先把整个代码块放到第一个宏task中,遇到promise,先执行内部代码,再把代码放到task中。遇到console.log(4),直接在主线程中执行。之后,从微任务中获取任务并执行console.log(3)并将以下setTimeout放入下一个宏任务队列(第二个)。然后从当前宏任务队列中取出要执行的代码,打印1。然后开始下一个事件循环,把宏任务的代码捞出来执行。所以订单是24315
