終于明白的setTimeout()方法

以前做小白時,只知道setTimeout是延時器,可以讓代碼延遲執(zhí)行,當今天被IOS13的禁止在程序主線程以外修改布局,被虐哭。
是一個用框架寫的APP,里面用了一個時間選擇器,需要在渲染選擇器外層樣式之后,再重新渲染時間選項。那么問題來了,怎么辦0.0 檢查了時間插件之后,發(fā)現(xiàn)并沒有什么問題。所以就默默加了setTimeout(),突然發(fā)現(xiàn),好了。。。
下面是當時測試在控制臺的報錯。。。

Modifications to the layout engine must not be performed from a background thread

解決完問題之后,決定去看看真正的setTimeout到底是什么樣的,路過一位大佬的博客,感覺大佬講解的很明白,作為筆記記下來保留一份,以便日后查閱。
感謝大佬的詳細講解,大佬鏈接鎮(zhèn)樓。

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

下面就是正文啦
大佬的例子是一個景點的JavaScript題

  for(var i=1; i<=9; i++) {
  setTimeout(function(){
    console.log( i );
  },1000 ); 
 }

答案呢,是9個10,為什么咩?
其實原理是因為,我們在for循環(huán)中定義的變量i,在for循環(huán)結束后并沒有走出它的作用域,循環(huán)一次,定時器就會加入任務隊列,但是定時器并沒有執(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ù)是時間值。
調用setTimeout時,把函數(shù)參數(shù)放入事件隊列中。等主程序運行完,再調用。
可以理解為1000ms之后,再放入事件隊列中,如果此時隊列為空,那么直接調用當前函數(shù)。如果前面還有其他時間,那就等待。
因此setTimeout是一個約會從來都不準時的小伙子
那現(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ù)即時間值不一樣,所以先執(zhí)行后一個時間戳。

注意:調用setTimeout時,把函數(shù)參數(shù),放到事件隊列中,等主程序運行完,再調用。即便是時間值為0,它也會等主程序執(zhí)行完再執(zhí)行,如果主程序隊列為空,就會直接調用。

HTML5標準規(guī)定了setTimeout()的第二個參數(shù)的最小值(最短間隔),不得低于4毫秒,如果低于這個值,就會自動增加。老版本的瀏覽器都將最短間隔設為10毫秒。而這里設置為0,其實是想表達立即執(zhí)行的意思,也就是說,等當前代碼執(zhí)行完(執(zhí)行棧清空)以后,立即執(zhí)行(0毫秒間隔)指定的回調函數(shù)。而實際上是最少4ms。

這是大佬寫的setTimeout的詳解,感覺看完明白了很多,完美。
最后是大佬的文章版權信息:

作者:江峰★
出處:http://www.cnblogs.com/jf-67/
本文版權歸作者和博客園共有,歡迎轉載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容