終于明白的setTimeout()方法

以前做小白時锐锣,只知道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)樓。

https://www.cnblogs.com/jf-67/p/6483686.html

下面就是正文啦
大佬的例子是一個景點(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)利

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旧蛾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蠕嫁,更是在濱河造成了極大的恐慌锨天,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剃毒,死亡現(xiàn)場離奇詭異病袄,居然都是意外死亡搂赋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門益缠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脑奠,“玉大人,你說我怎么就攤上這事左刽∞嘈牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵欠痴,是天一觀的道長迄靠。 經(jīng)常有香客問我,道長喇辽,這世上最難降的妖魔是什么掌挚? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮菩咨,結(jié)果婚禮上吠式,老公的妹妹穿的比我還像新娘。我一直安慰自己抽米,他們只是感情好特占,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著云茸,像睡著了一般是目。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上标捺,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天懊纳,我揣著相機(jī)與錄音,去河邊找鬼亡容。 笑死嗤疯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闺兢。 我是一名探鬼主播茂缚,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼列敲!你這毒婦竟也來了阱佛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤戴而,失蹤者是張志新(化名)和其女友劉穎凑术,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體所意,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淮逊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年催首,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泄鹏。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡郎任,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出备籽,到底是詐尸還是另有隱情舶治,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布车猬,位于F島的核電站霉猛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏珠闰。R本人自食惡果不足惜惜浅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伏嗜。 院中可真熱鬧坛悉,春花似錦、人聲如沸承绸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽军熏。三九已至空民,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羞迷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工画饥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衔瓮,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓抖甘,卻偏偏與公主長得像热鞍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衔彻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容