鏈€杩戝湪瀛︿範涓€浜涘簳灞傜煡璇嗐€傛墍浠ユ垜鎯冲仛涓€涓郴鍒楁潵灏濊瘯璁茶杩欎簺姣旇緝澶嶆潅鍜岄噸瑕佺殑鐭ヨ瘑鐐广€傚涔犲氨鍍忎竴搴уぇ灞便€傚彧鏈夎嚜宸辩埇灞憋紝鎵嶈兘鐪嬪埌涓嶄竴鏍风殑椋庢櫙锛屼綋楠屾洿娣卞埢銆備粖澶╂垜浠氨鏉ヨ璇碫ue涓瘮杈冮噸瑕佺殑寮傛鏇存柊绛栫暐鍜宯extTick鍘熺悊銆傚湪璇存棰樹箣鍓嶏紝鎴戜滑鍙互鍏堢湅鐪嬩笅闈㈣繖涓潰璇曢锛歴etTimeout(()=>{console.log('300ms鍚庣湡鐨勬墦鍗板嚭鏉ヤ簡鍚楋紵')},300)杩欐浠g爜寰堢畝鍗曪紝鐩镐俊寰堝浜轰細璇存槸鐨勩€傚綋鐒朵篃涓嶄箯澶х墰锛岀瓟妗堜竴鐩簡鐒躲€備负浠€涔堟槸杩欐牱锛熼潰璇曟椂濡備綍鍥炵瓟杩欑被闂鎵嶈兘璁╅潰璇曞畼婊℃剰锛屽浣曚紶鎾垜浠殑鐭ヨ瘑鐐广€傚湪姝e紡璁茶В涔嬪墠锛屾垜浠彲浠ュ厛浜嗚В涓€浜涚畝鍗曠殑姒傚康锛氫粈涔堟槸杩涚▼锛氳繘绋嬫槸cpu鍒嗛厤璧勬簮鐨勬渶灏忓崟浣嶏紱锛堟槸鍙互鎷ユ湁璧勬簮骞剁嫭绔嬭繍琛岀殑鏈€灏忓崟浣嶏級浠€涔堟槸绾跨▼锛氱嚎绋嬫槸cpu璋冨害鐨勬渶灏忓崟浣嶏紱锛堢嚎绋嬫槸鍩轰簬杩涚▼鐨勭▼搴忚繍琛屽崟鍏冿紝涓€涓繘绋嬩腑鍙互鏈夊涓嚎绋嬨€傦級杩欎釜姒傚康鐞嗚В璧锋潵姣旇緝鏋嚗锛屾墦涓瘮鏂癸細杩涚▼灏辨槸涓€涓叕鍙革紝姣忎釜鍏徃閮芥湁鑷繁鐨勮祫婧愩€傝皟搴︼紱鍏徃鐩镐簰鐙珛锛涚嚎绋嬫槸鍏徃涓殑姣忎釜鍛樺伐銆傚鍚嶅憳宸ュ叡鍚屽畬鎴愪换鍔°€備竴涓叕鍙稿彲浠ユ湁涓€涓垨澶氫釜鍛樺伐锛屽憳宸ュ叡浜叕鍙哥殑绌洪棿銆傛祻瑙堝櫒鏄杩涚▼鐨勶細鍦ㄦ祻瑙堝櫒涓紝姣忔墦寮€涓€涓爣绛鹃〉锛屽疄闄呬笂鏄墦寮€浜嗕竴涓柊鐨勮繘绋嬨€傚湪杩欎釜杩涚▼涓紝鏈塽i娓叉煋绾跨▼銆乯s寮曟搸绾跨▼銆乭ttp璇锋眰绾跨▼绛夛紝鍥犳娴忚鍣ㄦ槸涓€涓杩涚▼銆俲s鏄崟绾跨▼鐨勶細js鏄祻瑙堝櫒鐨勮剼鏈瑷€锛屼富瑕佸疄鐜扮敤鎴蜂笌娴忚鍣ㄧ殑浜や簰锛屽dom杩涜鎿嶄綔锛涜繖灏卞喅瀹氫簡瀹冨彧鑳芥槸鍗曠嚎绋嬬殑锛屽惁鍒欎細甯︽潵闈炲父澶嶆潅鐨勫悓姝ラ棶棰樸€傛瘮濡傦細濡傛灉js璁捐鎴愬绾跨▼锛屽鏋滀竴涓嚎绋嬭淇敼涓€涓猟om鍏冪礌锛屽彟涓€涓嚎绋嬭鍒犻櫎dom鍏冪礌锛屾祻瑙堝櫒灏变細涓嶇煡鎵€鎺紝鏃犳墍閫備粠銆傚洜姝わ紝涓轰簡閬垮厤澶嶆潅鎬э紝JavaScript浠庝竴寮€濮嬪氨鏄崟绾跨▼鐨勩€俲s鎵ц鏈哄埗--浜嬩欢寰幆鐢变簬js鏄崟绾跨▼鐨勶紝js璁捐鑰呭皢浠诲姟鍒嗕负鍚屾浠诲姟鍜屽紓姝ヤ换鍔★紝鍚屾浠诲姟閮藉湪涓荤嚎绋嬮槦鍒楁墽琛岋紝濡傛灉鍓嶉潰鐨勪换鍔℃病鏈夊畬鎴愶紝鍚庨潰鐨勪换鍔′細涓€鐩寸瓑寰咃紱寮傛浠诲姟鎸傚湪涓€涓换鍔¢槦鍒椾腑锛岀瓑寰呬富绾跨▼鐨勬墍鏈変换鍔℃墽琛屽畬姣曪紝閫氱煡浠诲姟闃熷垪鍙互鎶婂彲鎵ц鐨勪换鍔℃斁鍒版墽琛岀殑涓荤嚎绋嬨€備富绾跨▼鎵ц瀹屽紓姝ヤ换鍔″悗锛岄€氱煡浠诲姟闃熷垪鍦ㄤ富绾跨▼鎵ц涓嬩竴涓紓姝ヤ换鍔°€傝繖涓繃绋嬩竴鐩存寔缁埌寮傛浠诲姟鎵ц瀹屾垚銆傝繖绉嶄笉鏂噸澶嶇殑杩囩▼绉颁负浜嬩欢寰幆銆備竴涓懆鏈熸槸涓€涓淮绛斿0銆備换鍔¢槦鍒椾腑鐨勫紓姝ヤ换鍔″彲浠ュ垎涓簃icrotast锛堝井浠诲姟锛夊拰macrotask锛堝畯浠诲姟锛変袱绉?Object.observe,MutationObserver瀹忎换鍔★紙macrotask锛?/font>锛氳剼鏈暣浣撲唬鐮侊紝setTimeout锛宻etInterval绛夋墽琛屼紭鍏堢骇锛屽厛鎵цmacrotask瀹忎换鍔★紝鍐嶆墽琛宮icrotask寰瀷浠诲姟銆傛墽琛岃繃绋嬩腑闇€瑕佹敞鎰忕殑鍑犵偣鏄細鍦ㄤ簨浠跺惊鐜腑锛宮icrotasks鏄笉鏂幏鍙栫殑锛岀洿鍒癿icrotask闃熷垪娓呯┖锛岃€宮acrotasks鏄惊鐜幏鍙栦竴娆°€傚鏋滃湪浜嬩欢寰幆鎵ц鐨勮繃绋嬩腑鍔犲叆浜嗗紓姝ヤ换鍔★紝濡傛灉鏄痬acrotask锛屽垯浼氭斁鍦╩acrotask鐨勬湯灏撅紝绛夊緟涓嬩竴涓惊鐜墽琛屻€傚鏋滄槸microtask锛屼細鍦ㄨ繖涓簨浠跺惊鐜腑鏀惧埌microtask浠诲姟鐨勬湯灏剧户缁墽琛屻€傜洿鍒板井浠诲姟闃熷垪娓呯┖銆傝嚦姝わ紝浣犲氨鍙互鐞嗚В涓轰粈涔堜笂闈㈢殑300ms瀹氭椂鍣ㄤ笉涓€瀹氬湪300ms鍚庢墦鍗板嚭鏉ヤ簡锛氬洜涓?00ms鐨剆etTimeout骞朵笉鏄300ms鍚庨┈涓婃墽琛岋紝鑰屾槸300ms鍚庢斁鍒颁换鍔″垪琛ㄤ腑銆傚湪绛夊緟浜嬩欢寰幆鎵ц鐨勫悓鏃剁瓑寰呬簨浠跺惊鐜墽琛屼唬鐮併€傚鏋滄槸寮傛浠诲姟鍒楄〃涓敮涓€鐨刴acrotask浠诲姟锛岄偅涔堟濂芥槸300ms銆備絾鏄鏋滄湁microtast涔嬬被鐨勫叾浠栦换鍔★紝灏?00澶歮s浜嗐€傚欢浼镐竴锛氳繖绫婚棶棰樺湪闈㈣瘯杩囩▼涓湁鏃朵細閬囧埌銆備箣鍓嶆垜浠ヤ负鑰冪殑鏄痩et鍜寁ar鐨勫尯鍒紝鍏跺疄閲岄潰涔熷寘鍚簡鎴戜粖澶╄鐨勭煡璇嗐€俧or(vari=0;i<3;i++){console.log("i鐨勫€煎湪for:"+i)vartime=setTimeout(()=>{console.log("i鐨勫€煎湪setTimeout:"+i)},300);}鎵撳嵃鍑烘潵鐨勭粨鏋滄槸浠€涔堟牱瀛愮殑锛?.for寰幆鎵ц鐨勬椂鍊欙紝瀹氫箟浜嗕笁涓畾鏃跺櫒銆傜敱浜巗etTimeout鏄竴涓紓姝ヤ换鍔★紝鎵€浠ヤ笁涓畾鏃跺櫒閮戒細鍦?00ms鍚庡姞鍏ヤ换鍔¢槦鍒椼€?銆佹鏃舵墽琛屼唬鐮侊紝杈撳嚭涓璱鐨勫€糵or:1,2,3300ms鍚庯紝姣忔setTimeout鍔犲叆浠诲姟闃熷垪锛屾鏃秄or寰幆鏃╁氨鎵ц瀹屼簡锛屼富绾跨▼鎵ц瀹屽悗姝ゆ椂鐨刬鍙樻垚浜?銆傜敱浜庢鏃秙etTimeout鍖垮悕鍥炶皟鍑芥暟涓€鐩翠繚鎸佺潃瀵瑰閮ㄥ彉閲廼鐨勫紩鐢紝鎵€浠ユ渶缁堝張鎵撳嵃鍑轰簡3涓?fontbackground-color=#fff5f5color=#ff502c>ThevalueofiinsetTimeout:3鐨勫彉鍖栧畠涓巐et缁撴灉鏄笉鍚岀殑銆傛渶鍚庢墦鍗?fontbackground-color=#fff5f5color=#ff502c>setTimeout涓璱鐨勫€间緷娆′负锛?,1,2for(leti=0;i<3;i++){console.log("for:"+i)vartime=setTimeout(()=>{console.log("setTimeout涓璱鐨勫€?"+i)},300);}1.var澹版槑鐨勫彉閲忓湪鍏ㄥ眬鑼冨洿鍐呮槸鏈夋晥鐨勶紝鎵€浠ヤ笘鐣屼笂鍙湁涓€涓彉閲廼锛屾瘡娆″惊鐜竴娆″彉閲廼鐨勫€奸兘浼氭敼鍙橈紝鑰屽湪寰幆鍐呴儴锛宨璧嬪€肩粰setTimeout鍑芥暟鎸囧悜鐨勬槸鍏ㄥ眬i锛岀粨鍚堝墠闈㈣鐨勪簨浠舵墽琛屾満鍒讹紝涓婁竴杞墦鍗板嚭鏉ョ殑i涔熸槸3銆?.let澹版槑鐨勫彉閲忥紝let鍙湪block鍜宻cope鍐呮湁鏁堬紝鏈夋病鏈夊彉閲忔彁鍗囥€傛墍浠etTimeout涓殑i姣忔寰幆閮芥槸涓€涓柊鍙橀噺銆傪煠旀棦鐒舵瘡娆″惊鐜殑i閮芥槸涓€涓柊鍊硷紝閭d箞杈撳嚭鐨勭粨鏋滃簲璇ユ槸鍒濆鍖栧€?锛熻繖鏄洜涓篔avaScript寮曟搸鍦ㄥ唴閮ㄨ浣忎簡鍓嶄竴涓惊鐜殑鍊笺€傚湪鍒濆鍖栧綋鍓嶅彉閲廼鏃讹紝鏄湪涓婁竴娆″惊鐜殑鍩虹涓婅繘琛岃绠楃殑銆傛墿灞?锛氬綋浣犳妸涓€涓煡璇嗙偣鐞嗚В閫忎簡锛屼綘浼氬彂鐜板叾浠栧湴鏂逛篃涓€鏍凤紝鎴戜滑鐪嬩笅闈㈢殑浠g爜锛歝onsole.log(1);setTimeout(function(){console.log(2)},0);newPromise(function(resolve){console.log(3)for(vari=100;i>0;i--){i==1&&resolve()}console.log(4)}).then(function(){console.log(5)}).then(function(){console.log(6)});console.log(7);闈㈣瘯涓篃缁忓父娴嬭瘯杩欐浠g爜銆備箣鍓嶅緢杩疯尗锛屼絾鏄綋浣犳帉鎻′簡浠婂ぉ鐨勭煡璇嗭紝浣犱細鍙戠幇涓€鍒囬兘鏄偅涔堢畝鍗?.鐢变簬鑴氭湰涔熷睘浜巑acrotask锛屾墍浠ユ暣涓剼鏈殑鍐呭閮芥斁鍦ㄤ富绾跨▼锛堜换鍔℃爤锛変腑锛屼互鍙婁唬鐮佹寜椤哄簭鎵ц銆傜劧鍚庨亣鍒癱onsole.log(1)锛岀洿鎺ユ墦鍗?銆傞亣鍒皊etTimeout锛岃〃绀?绉掑悗鍔犲叆浠诲姟闃熷垪銆傚洜涓簊etTimeout鏄竴涓畯浠诲姟锛屾墍浠ヤ細鏀惧湪涓嬩竴涓畯浠诲姟涓紝杩欓噷涓嶄細鎵ц銆傞亣鍒皀ewPromise锛宯ewPromise鍦ㄥ疄渚嬭繃绋嬩腑鍚屾鎵ц浠g爜锛屽彧鏈塩allback.then()鏄井浠诲姟銆傛墍浠ュ厛鎵撳嵃3銆傛墽琛屽惊鐜悗鎵撳嵃4銆傜劧鍚庨亣鍒扮涓€涓?then()锛屽睘浜巑icrotask锛屽姞鍏ュ埌鏈寰幆鐨刴icrotask闃熷垪涓€傜劧鍚庡悜涓嬫墽琛岋紝閬囧埌涓€涓?then()锛屽姞鍏ュ埌鏈寰幆鐨刴icrotask闃熷垪涓€傜劧鍚庣户缁悜涓嬫墽琛屻€傞亣鍒癱onsole.log(7)锛岀洿鎺ユ墦鍗?銆傝嚦姝わ紝涓€娆′簨浠跺惊鐜殑macrotask鎵ц瀹屾瘯锛屽啀鏌ョ湅鏈寰幆涓槸鍚︽湁microtask锛屽彂鐜拌繕鏈夊垰鎵嶇殑.then()锛岀珛鍗虫斁鍏ヤ富绾跨▼鎵ц锛屽苟鎵撳嵃out5.鐒跺悗鍙戠幇杩樻湁绗簩涓?then()锛岄┈涓婃斁鍏ヤ富绾跨▼鎵ц锛屾墦鍗板嚭6銆傛鏃秏icrotask浠诲姟鍒楄〃娓呯┖銆傝繖鏍峰氨瀹屾垚浜嗙涓€涓惊鐜€傜浜屾浜嬩欢寰幆锛屼粠macrotask浠诲姟鍒楄〃涓壘鍒扮涓€娆℃斁鍏ョ殑setTimeout锛屾斁鍏ヤ富绾跨▼鎵ц锛屾墦鍗板嚭2銆傛渶缁堟墦鍗板嚭鏉ョ殑缁撴灉锛歷ue涓殑1銆?銆?銆?銆?銆?銆?鎵╁睍--寮傛鏇存柊绛栫暐鍜宯extTick鍘熺悊骞虫椂鍙兘闈㈣瘯寰堝锛岀粡甯歌闂埌锛歷ue涓殑nextTick鏄粈涔堬紵瀹冪殑鍘熺悊鍜屼綔鐢ㄦ槸浠€涔堬紵nextTick鍒板簳鏄粈涔堬紝瀹樻柟鏂囨。鏄繖鏍峰畾涔夌殑锛氫笅涓€涓狣OM鏇存柊鍛ㄦ湡缁撴潫鍚庢墽琛岀殑寤惰繜鍥炶皟銆備慨鏀规暟鎹悗绔嬪嵆浣跨敤姝ゆ柟娉曡幏鍙栨洿鏂板悗鐨凞OM銆傛垜浠篃鍙互绠€鍗曠悊瑙d负锛?fontbackground-color=#fff5f5color=#ff502c>褰撻〉闈腑鐨勬暟鎹彂鐢熷彉鍖栨椂锛屼换鍔′細琚斁鍏ヤ竴涓紓姝ラ槦鍒椾腑锛屽彧鏈夊綋褰撳墠浠诲姟琚墽琛屾椂鎵嶄細鎵ц闂茬疆鐨勩€傛墽琛孌OM娓叉煋銆傚綋DOM娓叉煋瀹屾垚鍚庯紝璇ュ嚱鏁颁細鑷姩鎵ц銆?/font>缁撳悎涓婇潰鎻愬埌鐨刴icrotasks鏉ョ悊瑙o紝microtask涓€鐩村湪杩欎釜寰幆涓彇锛岀洿鍒癿icrotask闃熷垪娓呯┖锛岃€宮acrotask鏄竴涓懆鏈熷彇涓€娆★紝姣忔涓轰竴涓猼ick銆傚洜姝わ紝褰撴暟鎹殑setter琚Е鍙戞椂锛孷ue浼氬湪microtask涓垱寤轰竴涓猚b浜嬩欢锛屽畠浼氬湪寰幆鍒颁笅涓€涓猼ick鏃惰嚜鍔ㄦ墽琛岃繖涓簨浠躲€傜粨鍚堟簮鐮侊紝鎴戜滑鍐嶇粏缁嗗搧鍛筹細褰撴煇涓暟鎹殑setter鏂规硶琚Е鍙戞椂锛屽叾setter鍑芥暟浼氬湪闂寘涓€氱煡Dep锛孌ep浼氳皟鐢ㄥ叾绠$悊鐨勬墍鏈塛atch瀵硅薄銆傝Е鍙慦atch瀵硅薄鐨勬洿鏂板疄鐜般€傛垜浠潵鐪嬬湅鏇存柊鏄浣曞疄鐜扮殑銆傦紙杩欓噷鐨凞ep鍜學atcher鏄疺ue鍝嶅簲寮忕殑鍩虹锛屽悗闈㈢殑绔犺妭浼氳鍒帮紝杩欓噷鍙渶瑕佷簡瑙g姸鎬佸彉鍖栨洿鏂版椂锛岃皟鐢╱pdate鍑芥暟杩涜鏇存柊鍗冲彲锛?*Scheduler鎺ュ彛锛屼緷璧栨椂鍥炶皟change*/update(){/*istanbulignoreelse*/if(this.lazy){this.dirty=true}elseif(this.sync){/*鍚屾锛屾墽琛宺un鐩存帴娓叉煋瑙嗗浘*/this.run()}else{/*寮傛鎺ㄩ€佸埌瑙傚療鑰呴槦鍒楀苟鍦ㄤ笅涓€涓淮绛旀椂璋冪敤銆?/queueWatcher(this)}}浠庝唬鐮佷腑鍙互鐪嬪嚭锛岀姸鎬佸彂鐢熷彉鍖栨椂浼氳皟鐢╭ueueWatcher(this)鍑芥暟锛岃繖涔熸槸vue寮傛鏇存柊闃熷垪鐨勬柟寮忋€傞偅鎴戜滑灏卞幓鐪嬬湅queueWatcher鍋氫簡浠€涔?*Push涓€涓瀵熻€呭璞″埌瑙傚療鑰呴槦鍒椾腑銆傚鏋滈槦鍒椾腑宸茬粡瀛樺湪鐩稿悓鐨刬d锛岄偅涔堜細璺宠繃瑙傚療鑰呭璞★紝闄ら潪鍦ㄥ埛鏂伴槦鍒楁椂灏嗗叾鍘嬪叆*/exportfunctionqueueWatcher(watcher:Watcher){/*鑾峰彇瑙傚療鑰呯殑id*/constid=watcher.id/*妫€鏌d鏄惁瀛樺湪锛屽瓨鍦ㄥ垯璺宠繃锛屼笉瀛樺湪鍒欐爣璁癶ash琛紝涓嬫妫€鏌?/if(has[id]==null){has[id]=trueif(!flushing){queue.push(watcher)}else{//濡傛灉宸茬粡鍒锋柊锛屾牴鎹畠鐨刬d鎷兼帴watcher//濡傛灉宸茬粡瓒呰繃瀹冪殑id锛屽畠灏嗙珛鍗宠繍琛屻€傝i=queue.length-1while(i>=0&&queue[i].id>watcher.id){i--}queue.splice(Math.max(i,index)+1,0,watcher)}//queuetheflushif(!waiting){waiting=truenextTick(flushSchedulerQueue)}}}浠巕ueueWatcher浠g爜鍙互鐪嬪嚭锛學atch瀵硅薄骞舵病鏈夌珛鍗虫洿鏂皏iew锛岃€屾槸琚玴ush鍒颁竴涓猶ueue闃熷垪涓€傛鏃剁姸鎬佷负绛夊緟鐘舵€併€傝繖鏃跺€欙紝Watch瀵硅薄浼氫笉鏂殑琚帹鍏ヨ繖涓猶ueue闃熷垪涓€傚綋涓嬩竴涓猼ick杩愯鐨勬椂鍊欙紝鎵€鏈夌殑queue闃熷垪浼氳鍙栧嚭鏉ラ噸鏂拌繍琛屻€傝繖浜沇atch瀵硅薄浼氳閬嶅巻鍙栧嚭鏉ユ洿鏂拌鍥俱€傚悓鏃讹紝id閲嶅鐨刉atcher涓嶄細琚娆″姞鍏ラ槦鍒椼€傝繖涔熻В閲婁簡鍚屼竴涓瀵熻€呰瑙﹀彂澶氭锛屽彧浼氳鎺ㄥ叆闃熷垪涓€娆°€傝繖涓椂鍊欏彲浠ョ◢浣滃仠椤匡紝鍊熼壌杩欑鍥撅紝鍐嶄粩缁嗙湅锛氫粠鍥惧拰涔嬪墠鎻愬埌鐨凟ventloop鎬荤粨涓€涓嬶細vue涓轰簡閬垮厤棰戠箒鎿嶄綔DOM锛屽紓姝ユ洿鏂癉OM銆傝繖浜涘紓姝ユ搷浣滀細閫氳繃nextTick鍑芥暟锛堝井浠诲姟浼樺厛绾э級浠b鐨勫舰寮忔斁鍏ヤ换鍔¢槦鍒椾腑锛岃繖浜沜b浼氬湪姣忔tick鍚庢墽琛岋紝鏇存柊DOM銆?/font>涓轰簡瀹炵幇寮傛鏇存柊鐨勬晥鏋滐紝vue寤虹珛浜唍extTick鍑芥暟銆傛帴涓嬫潵鎴戜滑鐪嬬湅nextTick鏄浣曞疄鐜扮殑銆傚弬鑰冩簮鐮佸湴鍧€鏌ョ湅銆?*瀛樺偍寮傛鎵ц鐨勫洖璋?/constcallbacks=[]/*涓€涓爣璁颁綅锛屽鏋滃凡缁忔湁timerFunc鎺ㄩ€佸埌浠诲姟闃熷垪锛屽垯涓嶉渶瑕侀噸澶嶆帹閫?/letpending=false/*涓€涓嚱鏁版寚閽?鎸囧悜鐨勫嚱鏁颁細琚帹閫佸埌浠诲姟闃熷垪涓紝褰撲富绾跨▼浠诲姟鎵ц鏃讹紝浼氳皟鐢ㄤ换鍔¢槦鍒椾腑鐨則imerFunc*/lettimerFunc/*鎺ㄩ€佸埌闃熷垪涓殑涓嬩竴涓猼ick骞舵墽琛宑b鍥炶皟functionctxcontext*/exportfunctionnextTick(cb?:Function,ctx?:Object){let_resolve//绗竴姝ヤ紶鍏ョ殑cb浼氳push鍒癱allbacks涓苟瀛樺偍callbacks.push(()=>{if(cb){try{cb.call(ctx)}catch(e){handleError(e,ctx,'nextTick')}}elseif(_resolve){_resolve(ctx)}})//妫€鏌ヤ箣鍓嶇殑寮傛鏄惁浠诲姟闃熷垪锛堝嵆鍚嶄负鍥炶皟鐨勪换鍔℃暟缁勶級璋冨害鍜屾墽琛屽畬鎴愩€傝繖閲岀殑pending鐩稿綋浜庝竴涓攣if(!pending){//濡傛灉涔嬪墠鐨勫紓姝ヤ换鍔¢槦鍒楀凡缁忔墽琛屽畬姣曪紝鍒欒缃畃ending涓簍rue锛堥攣瀹氶攣锛塸ending=true//璋冪敤鍒ゆ柇Promise,MutationObserver,setTimeout浼樺厛绾imerFunc()}//绗笁姝ユ墽琛岃繑鍥炵殑鐘舵€乮f(!cb&&typeofPromise!=='undefined'){returnnewPromise(resolve=>{_resolve=resolve})}}鍏充簬timerFunc鍑芥暟杩欓噷鐪佺暐浜嗭紝瀹冨叾瀹炲氨鏄垽鏂娇鐢≒romise銆丮utationObserver銆乻etTimeout鐨勪紭鍏堢骇銆傜郴缁熶腑浼氫紭鍏堜娇鐢≒romise锛屽綋Promise涓嶅瓨鍦ㄦ椂浼氫娇鐢∕utationObserver銆傝繖涓や釜鏂规硶浼氬湪microtask涓墽琛岋紝浼氭棭浜巗etTimeout鎵ц锛屾墍浠ヤ紭鍏堜娇鐢ㄣ€傚鏋滀互涓婁袱涓柟娉曚笉鏀寔鐜锛屽湪浠诲姟缁撴潫鏃朵細浣跨敤setTimeout鏉ユ帹閫佽繖涓嚱鏁帮紝绛夊緟璋冪敤鎵ц銆傛€濊€凁煠旓細涓轰粈涔圥romise鍜孧utationObserver鈥渟etTimeout鈥濈殑椤哄簭鏄厛鍦ㄤ富绾跨▼鎵ц锛熷鏋滃啀閬囧埌macrotask锛屽氨鏀惧湪macrotask浠诲姟闃熷垪鐨勫熬閮ㄣ€傜敱浜庝竴涓猠ventloop鍙兘鍙栦竴涓猰acrotask锛屾墍浠acrotask閬囧埌闇€瑕佺瓑寰呭叾浠栧嚑杞殑浜嬩欢寰幆锛涘鏋滈亣鍒颁竴涓猰icrotask锛屼細琚斁鍒版湰娆″惊鐜殑microtask闃熷垪涓€傝繖鏍锋垜浠氨鍙互鐞嗚В涓轰粈涔坢icrotask鍏堜簬macrotask澶勭悊銆傝繖灏辨槸涓轰粈涔坣extTick鎬绘槸鍦╯etTimeout涔嬪墠鎵ц銆傛€荤粨涓€涓嬶紝浠旂粏鐪嬬湅瀹樻柟鏂囨。锛屽姞娣辩悊瑙o細瀹樻柟鏂囨。Vue鍦ㄦ洿鏂癉OM鐨勬椂鍊欐槸寮傛鎵ц鐨勶紝鍙妫€娴嬪埌鏁版嵁鍙樺寲锛孷ue灏变細寮€涓€涓槦鍒楋紝缂撳啿鎵€鏈夌殑鏁版嵁鍙樺寲鍙戠敓鍦ㄥ悓涓€涓簨浠跺惊鐜腑銆傚鏋滃悓涓€涓瀵熻€呰澶氭瑙﹀彂锛屽畠鍙細琚帹鍏ラ槦鍒椾竴娆°€傝繖绉嶇紦鍐叉椂鐨勯噸澶嶆暟鎹垹闄ら潪甯搁噸瑕侊紝鍙互閬垮厤涓嶅繀瑕佺殑璁$畻鍜孌OM鎿嶄綔銆傜劧鍚庯紝鍦ㄤ笅涓€涓簨浠跺惊鐜€渢ick鈥濅腑锛孷ue鍒锋柊闃熷垪骞舵墽琛屽疄闄咃紙鍘婚噸锛夊伐浣溿€俈ue鍐呴儴灏濊瘯浣跨敤鍘熺敓鐨凱romise.then銆丮utationObserver鍜宻etImmediate鏉ュ疄鐜板紓姝ラ槦鍒椼€傚鏋滄墽琛岀幆澧冧笉鏀寔锛屽畠灏嗕娇鐢╯etTimeout(fn,0)浠f浛銆?/p>