当前位置: 首页 > Web前端 > JavaScript

js事件循环事件循环

时间:2023-03-27 10:03:23 JavaScript

瀹忎换鍔★細鑴氭湰锛堟暣浣撲唬鐮侊級銆乻etTimeout銆乻etInterval銆乻etImmediate銆両/O銆乁I娓叉煋寰换鍔★細process.nextTick(Nodejs)銆丳romises銆丱bject.observe銆丮utationObserver;setTimeout(()=>{console.log("setTimeout1");Promise.resolve().then(data=>{console.log(222);});});setTimeout(()=>{console.log("setTimeout2");});Promise.resolve().then(data=>{console.log(111);});//杩愯缁撴灉濡備笅111setTimeout1222setTimeout2/*鍚勪富瑕佷唬鐮佹墽琛屽畯浠诲姟瀹忎换鍔″寘鎷瑂etTimeOut浠诲姟闃熷垪涓嶄細绔嬪嵆鎵ц锛屼細涓€鐩磋繍琛屽埌鏈€鍚庝竴涓嚱鏁般€傚鏋滈亣鍒版柊鐨勫畯浠诲姟锛屾坊鍔犱换鍔″悗浼氭坊鍔犱换鍔¢槦鍒椼€傚綋涓讳唬鐮佹墽琛屽畬姣曪紝澶栭儴鐨刡itpromise绛夊井浠诲姟鎵ц瀹屾垚鍚庯紝浠庝笂鍒颁笅渚濇鎵ц瀹忎换鍔°€傚鏋滈槦鍒椾腑鐨勫畯浠诲姟鎵ц涓湁浠诲姟闃熷垪锛屽垯閲嶅寰幆銆傚畯浠诲姟瀹屾垚鍚庯紝鎵ц寰换鍔°€?/1.涓荤嚎绋嬩笂娌℃湁闇€瑕佹墽琛岀殑浠g爜2.鐒跺悗閬囧埌setTimeout0锛屽畠鐨勪綔鐢ㄦ槸0ms鍚庡皢鍥炶皟鍑芥暟鏀惧叆瀹忎换鍔¢槦鍒椾腑锛堣繖涓换鍔′細鍦ㄤ笅涓€涓簨浠朵腑鎵ц寰幆锛夈€?.鐒跺悗閬囧埌setTimeout0锛屽畠鐨勪綔鐢ㄦ槸0ms鍚庡皢鍥炶皟鍑芥暟鏀惧叆瀹忎换鍔¢槦鍒椾腑锛堣繖涓换鍔′細鍦ㄤ笅涓€涓簨浠跺惊鐜腑鎵ц锛夈€?.棣栧厛鏌ョ湅microtask闃熷垪锛屽嵆microtask闃熷垪锛屽彂鐜伴槦鍒椾笉涓虹┖锛屾墽琛岀涓€涓猵romise鐨則hen鍥炶皟锛岃緭鍑?111'銆傛鏃跺井浠诲姟闃熷垪涓虹┖锛岃繘鍏ヤ笅涓€涓簨浠跺惊鐜?.鏌ョ湅瀹忎换鍔¢槦鍒楋紝鎵惧埌涓€涓猻etTimeout鐨勫洖璋冨嚱鏁帮紝绔嬪嵆鎵ц鍥炶皟鍑芥暟杈撳嚭'setTimeout1'锛屾煡鐪嬪井浠诲姟闃熷垪锛屽彂鐜伴槦鍒椾笉涓虹┖锛屾墽琛宲romise鐨則hen鍥炶皟锛岃緭鍑?222'锛宮icrotask闃熷垪涓虹┖锛岃繘鍏ヤ笅涓€涓簨浠跺惊鐜€?銆佹煡鐪嬪畯浠诲姟闃熷垪锛屽彂鐜版湁setTimeout鍥炶皟鍑芥暟锛岀珛鍗虫墽琛屽洖璋冨嚱鏁拌緭鍑?setTimeout2'銆傪煂扮ず渚?锛歝onsole.log('鑴氭湰鍚姩');setTimeout(function(){console.log('setTimeout---0');},0);setTimeout(function(){console.log('setTimeout---200');setTimeout(function(){console.log('inner-setTimeout---0');});Promise.resolve().then(function(){console.log('promise5');});},200);Promise.resolve().then(function(){console.log('promise1');}).then(function(){console.log('promise2');});Promise.resolve().then(function(){console.log('promise3');});console.log('鑴氭湰缁撴潫');杩愯缁撴灉涓猴細scriptstartscriptendpromise1promise3promise2setTimeout---0setTimeout---200promise5inner-setTimeout---01銆傚厛鍦ㄤ富杩涚▼涓婁緷娆℃墽琛屽悓姝ヤ换鍔★紝绗竴鍙ュ拰鏈€鍚庝竴鍙ョ殑console.log2銆傜劧鍚庨亣鍒皊etTimeout0锛屽畠鐨勪綔鐢ㄦ槸鎶婂洖璋冨嚱鏁版斁鍒?ms鍚庣殑瀹忎换鍔¢槦鍒椾腑锛堣繖涓换鍔′細鍦ㄤ笅涓€涓簨浠跺惊鐜腑鎵ц锛夈€?.鐒跺悗閬囧埌setTimeout200锛屽畠鐨勪綔鐢ㄦ槸200ms鍚庡皢鍥炶皟鍑芥暟鏀惧叆瀹忎换鍔¢槦鍒椾腑锛堣繖涓换鍔′細鍦ㄤ笅涓€涓簨浠跺惊鐜腑鎵ц锛夈€?.鍚屾浠诲姟鎵ц瀹屽悗锛岄鍏堟煡鐪媘icrotask闃熷垪锛屽嵆microtask闃熷垪锛屽彂鐜伴槦鍒椾笉涓虹┖锛屾墽琛岀涓€涓猵romise鐨則hen鍥炶皟锛岃緭鍑?promise1'锛岀劧鍚庢墽琛宼hen鍥炶皟绗簩涓猵romise锛屽苟杈撳嚭'promise3'锛岀敱浜庣涓€涓猵romise鐨?then()鐨勮繑鍥炰粛鐒舵槸涓€涓猵romise锛屾墍浠ョ浜屼釜.then()浼氳鏀惧叆寰换鍔¢槦鍒楃户缁墽琛岋紝骞惰緭鍑?promise2';5.姝ゆ椂寰换鍔¢槦鍒椾负绌猴紝杩涘叆涓嬩竴涓簨浠跺惊鐜紝鏌ョ湅瀹忎换鍔¢槦鍒楋紝鎵惧埌涓€涓猻etTimeout鍥炶皟鍑芥暟锛岀珛鍗虫墽琛屽洖璋冨嚱鏁板苟杈撳嚭'setTimeout---0'锛屾煡鐪嬪井浠诲姟闃熷垪锛岄槦鍒椾负绌猴紝杩涘叆涓嬩竴涓簨浠跺惊鐜€?銆佹煡鐪嬪畯浠诲姟Queue锛屾壘鍒皊etTimeout鐨勫洖璋冨嚱鏁帮紝绔嬪嵆鎵ц鍥炶皟鍑芥暟骞惰緭鍑?setTimeout---200'銆傜劧鍚庨亣鍒皊etTimeout0锛屽畠鐨勪綔鐢ㄦ槸鍦?ms鍚庡皢鍥炶皟鍑芥暟鏀惧叆瀹忎换鍔¢槦鍒楋紝鏌ョ湅寰换鍔¢槦鍒楋紝涔熷氨鏄井浠诲姟闃熷垪锛屽彂鐜伴槦鍒椾笉涓虹┖锛屾墽琛宲romise鐨則hen鍥炶皟锛屽苟杈撳嚭鈥減romise5鈥濄€?銆佹鏃秏icrotask闃熷垪涓虹┖锛岃繘鍏ヤ笅涓€涓簨浠跺惊鐜紝鏌ョ湅macrotask闃熷垪锛屾壘鍒颁竴涓猻etTimeout鍥炶皟鍑芥暟锛岀珛鍗虫墽琛屽洖璋冨嚱鏁拌緭鍑猴紝杈撳嚭'inner-setTimeout---0'銆備负浠€涔堝湪浠g爜鎵ц缁撴潫鏃堕渶瑕佷簨浠跺惊鐜紵鍥犱负JavaScript鏄崟绾跨▼鐨勩€傚崟绾跨▼鏄寚鎵€鏈夌殑浠诲姟閮介渶瑕佹帓闃燂紝涓婁竴涓换鍔″畬鎴愬悗鎵嶄細鎵ц涓嬩竴涓换鍔°€傚鏋滃墠涓€涓换鍔¤€楁椂寰堥暱锛屽悗涓€涓换鍔″氨寰椾竴鐩寸瓑涓嬪幓銆備负浜嗗崗璋冧簨浠讹紙event锛夈€佺敤鎴蜂氦浜掞紙userinteraction锛夈€佽剼鏈紙script锛夈€佹覆鏌擄紙rendering锛夈€佺綉缁滐紙networking锛夌瓑锛岀敤鎴蜂唬鐞嗭紙useragent锛夊繀椤讳娇鐢ㄤ簨浠跺惊鐜紙eventloops锛?/p>