為何setTimeout時(shí)間參數(shù)設(shè)置為0,還是會(huì)延遲命满?
setTimeout(要執(zhí)行的任務(wù)瓦阐,間隔時(shí)間) 定時(shí)器任務(wù)只執(zhí)行一次,一般用于一次性延時(shí)問(wèn)題
用法一:setTimeout( function(){}, 時(shí)間)
用法二:function fn()? ?該函數(shù)可重復(fù)使用
????????????????setTimeout(任務(wù)名稱(chēng)函數(shù)名fn朝蜘, 間隔時(shí)間)
清除: clearTimeout
有一個(gè)概念:
js是單線程的,單線程就意味著涩金,所有任務(wù)需要排隊(duì)谱醇,前一個(gè)任務(wù)結(jié)束暇仲,才會(huì)執(zhí)行后一個(gè)任務(wù)。如果前一個(gè)任務(wù)耗時(shí)很長(zhǎng)副渴,后一個(gè)任務(wù)就不得不一直等著奈附。
而瀏覽器的內(nèi)核是多線程的,它們?cè)趦?nèi)核制控下相互配合以保持同步煮剧,一個(gè)瀏覽器至少實(shí)現(xiàn)三個(gè)常駐線程:javascript引擎線程斥滤,GUI渲染線程,瀏覽器事件觸發(fā)線程勉盅。
當(dāng)js代碼執(zhí)行遇到setTimeout(fn,millisec)時(shí)佑颇,會(huì)把fn這個(gè)函數(shù)放在任務(wù)隊(duì)列中,當(dāng)js引擎線程空閑時(shí)并達(dá)到millisec指定的時(shí)間時(shí)草娜,才會(huì)把fn放到j(luò)s引擎線程中執(zhí)行漩符。
setTimeout(fn,0)的含義是,指定某個(gè)任務(wù)在主線程最早可得的空閑時(shí)間執(zhí)行驱还,也就是說(shuō),盡可能早得執(zhí)行凸克。它在"任務(wù)隊(duì)列"的尾部添加一個(gè)事件议蟆,因此要等到同步任務(wù)和"任務(wù)隊(duì)列"現(xiàn)有的事件都處理完,才會(huì)得到執(zhí)行萎战。
setTimeout()只是將事件插入了"任務(wù)隊(duì)列"咐容,必須等到當(dāng)前代碼(執(zhí)行棧)執(zhí)行完,主線程才會(huì)去執(zhí)行它指定的回調(diào)函數(shù)蚂维。要是當(dāng)前代碼耗時(shí)很長(zhǎng)戳粒,有可能要等很久,所以并沒(méi)有辦法保證虫啥,回調(diào)函數(shù)一定會(huì)在setTimeout()指定的時(shí)間執(zhí)行蔚约。
setTimeout()屬于宏任務(wù)隊(duì)列。
用處:
函數(shù)去抖
輪訓(xùn)任務(wù)