## Event Loop ### ä»ç» JavaScript ä¹æä»¥è¢«è®¾è®¡ä¸ºå线ç¨ï¼æ¯å 为ä½ä¸ºä¸é¨èæ¬è¯è¨ï¼ä½¿ç¨å¤çº¿ç¨ä¼ä½¿æµè§å¨åå¾éå¸¸å¤æãæ¯å¦ï¼å½ä¸ä¸ªçº¿ç¨æ£å¨ä¿®æ¹ä¸ä¸ª dom å ç´ çæ ·å¼æ¶ï¼å¦ä¸ä¸ªçº¿ç¨å°å ¶å é¤ãè¿æ ·ï¼æµè§å¨å°±æ æ³å¤æè¯¥æä¹å»æ§è¡ã Javascript æä¸ä¸ª main thread 主线ç¨å call-stack è°ç¨æ (æ§è¡æ )ï¼ææçä»»å¡é½ä¼è¢«æ¾å°è°ç¨æ çå¾ ä¸»çº¿ç¨æ§è¡ã Event Loopæ¯ä¸ä¸ªç¨åºç»æï¼ç¨äºçå¾ ååéæ¶æ¯åäºä»¶ãå¨JavaScriptä¸ï¼ä»»å¡è¢«å为MacroTaskï¼å®ä»»å¡ï¼åMicroTaskï¼å¾®ä»»å¡ï¼ä¸¤ç§ã * MacroTask: script(æ´ä½ä»£ç ), setTimeout, setInterval, setImmediateï¼nodeãIE10ï¼, I/O, UI rendering * MicroTask: process.nextTickï¼nodeï¼, Promises, Object.observe(åºå¼), MutationObserver 䏿¬¡äºä»¶å¾ªç¯ï¼å æ§è¡ macroTask çææåæ¥ä»»å¡ï¼æ§è¡æ æ¸ ç©ºåï¼æ¥çææ²¡æ microTaskï¼æçè¯ä¸æ¬¡æ§æ§è¡ææç微任å¡ï¼æ¥çå¼å§ä¸ä¸æ¬¡å¾ªç¯ã ### è¿è¡é¡ºåº è¿è¡ scriptï¼MacroTaskï¼æ¶ï¼ä¼å æ§è¡å 鍿æç忥任å¡ï¼æ§è¡å®åå¼å§æ£æ¥ MicroTask ã妿æ process.nextTick ä¼æå ¥æ§è¡æ æåï¼ä¼å äºå ¶ä» MicroTaskï¼ï¼å¦ææ setImmediate å伿»åäºå ¶ä» MicroTaskã NodeçEvent Loopåé¶æ®µï¼é¶æ®µæå åï¼ä¾æ¬¡æ¯ * expired timers and intervalsï¼å³å°æçsetTimeout/setInterval * I/O eventsï¼å 嫿件ï¼ç½ç»çç * immediatesï¼éè¿setImmediate注åç彿° * close handlersï¼closeäºä»¶çåè°ï¼æ¯å¦TCPè¿æ¥æå¼ 忥任å¡åæ¯ä¸ªé¶æ®µä¹åé½ä¼æ¸ 空microtaskéå ä¼å æ¸ ç©ºnext tick queueï¼å³éè¿process.nextTick注åç彿° 忏 空other queueï¼å¸¸è§çå¦Promise ``` javascript console.log(1) setTimeout(() => { // MacroTask console.log(2) }, 0) Promise.resolve().then(() => { // MicroTask console.log(3) }).then(() => { console.log(4) }) console.log(5) // 1ã5ã3ã4ã2 console.log(1) setTimeout(() => { console.log(2) new Promise(resolve => { console.log(4) resolve() }).then(() => { console.log(5) }) process.nextTick(() => { console.log(3) }) }) new Promise(resolve => { console.log(7) resolve() }).then(() => { console.log(8) }) process.nextTick(() => { console.log(6) }) // 1ã7ã6ã8ã2ã4ã3ã5 setTimeout(function() { console.log('setTimeout'); }, 3000) new Promise(function(resolve) { setTimeout(function() { console.log('promise'); resolve() }, 2000) }).then(function() { console.log('then'); }) console.time() for (let i = 0; i < 20000; i++) { setTimeout(function() { console.log('for'); }, 3000) // console.log('for'); } console.timeEnd() console.log('console'); // æ§è¡å®ææåæ¥ä»»å¡ï¼è§å¯ææ²¡æå¾®ä»»å¡ï¼æ²¡æåè¿è¡ä¸ä¸ä¸ªå®ä»»å¡ï¼setTimeoutçè®¡æ¶æ¯åæ¶è¿è¡çï¼ä½æ¯å°±ç®æ¶é´å°äºï¼ä¹ä¸å®è¦æ§è¡æ æ¸ ç©ºä»¥åæä¼è¿è¡ãèä¸ï¼è¢«é»å¡åï¼å°±ç®ææç计æ¶å¨é½å°æ¶é´äºï¼ä¾ç¶ä¼æç §å®æ¶å¨å°ç¹çå å顺åºè¿è¡æ§è¡ï¼ã ``` ## setTimeout æµè§å¨é¡µé¢æ¯ç±æ¶æ¯éååäºä»¶å¾ªç¯ç³»ç»æ¥é©±å¨çã * 妿å½å忥任塿§è¡æ¶é´è¿ä¹ ï¼ä¼å½±å»¶è¿å°æå®æ¶å¨ä»»å¡çæ§è¡ * 妿 setTimeout åå¨åµå¥è°ç¨ï¼é£ä¹ç³»ç»ä¼è®¾ç½®æçæ¶é´é´é为 4 æ¯«ç§ * æªæ¿æ´»ç页é¢ï¼setTimeout æ§è¡æå°é´éæ¯ 1000 毫ç§ã为äºä¼ååå°é¡µé¢çå è½½æè以åéä½èçµéã * å»¶æ¶æ§è¡æ¶é´ææå¤§å¼ï¼ä¸è½å¤§äº 2147483647 毫ç§ï¼å¤§çº¦ 24.8 天ï¼ã