setTimeout的延時為0時,結果會是什么?


一直比較迷惑:js的setTimeout到底會在什么時候執行,如果執行了,和主執行腳本到底差多長時間?

由於不是很了解瀏覽器的內部執行策略,本文只能是通過前端一些測試依稀猜測些結論:

1)測試舉例

做了兩個例子:

1-1)腳本在頁面中直接執行,通過刷新看結果

<!DOCTYPE HTML>
<HTML>
 <HEAD>
  <script type="text/javascript">
  var t=new Date;
    setTimeout(function(){
            alert('cost time:'+(new Date-t))
        },0);
  </script>
 </HEAD>
 <BODY>
 </BODY>
</HTML>

 

  測試結果:  

  在ie各個版本瀏覽器下,得到的alert結果大體為:14左后,區間為8~21毫秒之間;

  chrome19,基本為1,區間為1~5之間,但是偶爾會是15左右

  firefox12,基本為3,區間為2~7之間,但是偶爾也有15左右的值

  safari5.1,基本為4,區間為1~7之間,但是偶爾也有15左右的值

  opera11.5,基本為5,區間為2~8之間,但是偶爾有很大值

1-2)通過點擊div看結果

  

<!DOCTYPE HTML>
<HTML>
 <HEAD>
  <script type="text/javascript">
  function test(){
    var t=new Date;
    setTimeout(function(){
            alert('cost time:'+(new Date-t))
        },0);

  }

  </script>
 </HEAD>
 <BODY>
    <div onclick='test()' id="div1" style="position:relative;width:200px;height:200px;background-color:green;left:100px;top:100px;">
    </div>
 </BODY>
</HTML>

 測試結果:  

  在ie各個版本瀏覽器下,得到的alert結果大體為:5左后,偶爾有大值;

  chrome19,基本為2,偶爾為3

  firefox12,基本為1,0,2,但是偶爾也有13左右的值

  safari5.1,基本為1,偶爾為2和3

  opera11.5,基本為4,3,,但是偶爾有12左右的值。

 

  以上測試,均在打開多個干擾復雜頁面的標簽、單個標簽中測試。結果差不多。

3)說明什么? 

  其實也得不到什么結論,但是測試結果基本反映了當前流行瀏覽器js腳本的效率排名。

  究其原因,可能得出一些印證:

  3-1)由於js的主執行線程為單線程,所以此值肯定一般大於0,setTimeout的執行時間點只是加入js主執行隊列中的時間點,至於什么時候執行,是由js引擎線程按順序執行的隊列來決定。此結論在很多處說到。可自行查閱( 如:JavaScript可否多線程? 深入理解JavaScript定時機制);

  此結論也印證很多時候用setTimeout做動畫不流暢的原因等。

  順便在此貼出背光的一副圖很能說明問題:

  

  

  3-2)測試偶爾的很大值,也有可能是js主執行線程中做了其他事情,如GC等。因為大值重復出現幾率很少。

 

 

總結:其實我是沒有得出結論,只是好奇,然后猜測,看看可能是情況和結果,希望大家批評指正。或者有結論的答復我。

 

 

另外:setTimout函數中第二個參數如果為負數,則和0具有一樣的效果,如果setTimeout(function(){console.log('test')},-100);等同於setTimeout(function(){console.log('test')},0)。

我以為會報錯,結果所有瀏覽器都沒有報錯。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM