以前做小白時锐锣,只知道setTimeout是延時器技即,可以讓代碼延遲執(zhí)行著洼,當(dāng)今天被IOS13的禁止在程序主線程以外修改布局,被虐哭。
是一個用框架寫的APP身笤,里面用了一個時間選擇器豹悬,需要在渲染選擇器外層樣式之后,再重新渲染時間選項液荸。那么問題來了瞻佛,怎么辦0.0 檢查了時間插件之后,發(fā)現(xiàn)并沒有什么問題莹弊。所以就默默加了setTimeout()涤久,突然發(fā)現(xiàn),好了忍弛。。考抄。
下面是當(dāng)時測試在控制臺的報錯细疚。。川梅。
Modifications to the layout engine must not be performed from a background thread
解決完問題之后疯兼,決定去看看真正的setTimeout到底是什么樣的,路過一位大佬的博客贫途,感覺大佬講解的很明白吧彪,作為筆記記下來保留一份,以便日后查閱丢早。
感謝大佬的詳細(xì)講解姨裸,大佬鏈接鎮(zhèn)樓。
下面就是正文啦
大佬的例子是一個景點(diǎn)的JavaScript題
for(var i=1; i<=9; i++) {
setTimeout(function(){
console.log( i );
},1000 );
}
答案呢怨酝,是9個10傀缩,為什么咩?
其實(shí)原理是因為农猬,我們在for循環(huán)中定義的變量i赡艰,在for循環(huán)結(jié)束后并沒有走出它的作用域,循環(huán)一次斤葱,定時器就會加入任務(wù)隊列慷垮,但是定時器并沒有執(zhí)行。也就是說for循環(huán)之后揍堕,i依然可以訪問料身,值等于最后一次循環(huán)的值,循環(huán)了9次鹤啡,就有了9次定時器惯驼。因此會輸出9個10。
既然醬紫,那把上面的for語句稍微修改一下
for(var i=1; i<=9; i++) {
console.log( i );
setTimeout(function(){
console.log( i );
},1000 );
}
現(xiàn)在的答案你們猜到了么祟牲?
答案是1隙畜、2、3说贝、4议惰、5、6乡恕、7言询、8、9然后是9個10傲宜,解答同上运杭。
可能這里最難理解的就是setTimeout的方式(注冊事件):它有兩個參數(shù),第一個參數(shù)是函數(shù)函卒,第二個參數(shù)是時間值辆憔。
調(diào)用setTimeout時,把函數(shù)參數(shù)放入事件隊列中报嵌。等主程序運(yùn)行完虱咧,再調(diào)用。
可以理解為1000ms之后锚国,再放入事件隊列中腕巡,如果此時隊列為空,那么直接調(diào)用當(dāng)前函數(shù)血筑。如果前面還有其他時間绘沉,那就等待。
因此setTimeout是一個約會從來都不準(zhǔn)時的小伙子
那現(xiàn)在代碼再修改一下
for(var i=1; i<=9; i++) {
console.log( i );
setTimeout(function(){
console.log( i );
},1000 );
}
for(var i=0; i<3; i++) {
setTimeout(function(){
console.log( i );
},1000 );
console.log( i );
}
現(xiàn)在的答案咩:1云挟、2梆砸、3、4园欣、5帖世、6、7沸枯、8日矫、9、0绑榴、1哪轿、2,然后是3次3翔怎,然后是9次3窃诉,其他的不說了杨耙,至于為什么是先出現(xiàn)3次3,然后是9次3呢飘痛?其實(shí)是因為第二個參數(shù)即時間值不一樣珊膜,所以先執(zhí)行后一個時間戳。
注意:調(diào)用setTimeout時宣脉,把函數(shù)參數(shù)车柠,放到事件隊列中,等主程序運(yùn)行完塑猖,再調(diào)用竹祷。即便是時間值為0,它也會等主程序執(zhí)行完再執(zhí)行羊苟,如果主程序隊列為空塑陵,就會直接調(diào)用。
HTML5標(biāo)準(zhǔn)規(guī)定了setTimeout()的第二個參數(shù)的最小值(最短間隔)蜡励,不得低于4毫秒猿妈,如果低于這個值,就會自動增加巍虫。老版本的瀏覽器都將最短間隔設(shè)為10毫秒。而這里設(shè)置為0鳍刷,其實(shí)是想表達(dá)立即執(zhí)行的意思占遥,也就是說,等當(dāng)前代碼執(zhí)行完(執(zhí)行棧清空)以后输瓜,立即執(zhí)行(0毫秒間隔)指定的回調(diào)函數(shù)瓦胎。而實(shí)際上是最少4ms。
這是大佬寫的setTimeout的詳解尤揣,感覺看完明白了很多搔啊,完美。
最后是大佬的文章版權(quán)信息:
作者:江峰★
出處:http://www.cnblogs.com/jf-67/
本文版權(quán)歸作者和博客園共有北戏,歡迎轉(zhuǎn)載负芋,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接嗜愈,否則保留追究法律責(zé)任的權(quán)利