2013-02-22 58 views
3

下面的代碼示例:可能的Javascript錯誤?

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Test</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

     <script> 
      i = 0 
      while(i < 500) 
      { 
       date = new Date() 
       console.log(i, ' ', date); 
       date.setHours(5) 
       i++ 
      } 

     </script> 

    </head> 
    <body> 
    </body> 
</html> 

Firebug控制檯最終輸出日期設定在5小時,而非原始的,未改變的日期。我只在Firefox 17上測試過。

回答

3

console.log不是異步的,它只是動態的。當您使用逗號符號記錄日期對象時,您正在記錄對該日期對象的實時引用,因此當它更新時,控制檯顯示也一樣。如果您登錄使用的toString相反,該值不會改變:

console.log("logging date as string, i : " i + " date : " + date); 
+0

是的,我比較了兩者,看起來你是對的。儘管如此,處理事情的方式卻很奇怪。絕對是值得注意的事情! – 2013-02-22 09:24:20

4

這取決於瀏覽器的實現console.log。據我所知,瀏覽器有一個異步console.log函數,這也是鉻的情況。異步函數的執行僅在瀏覽器沒有執行時才執行。

while (i < 500) { 
    date = new Date() 
    console.log(i, ' ', date); //this set aside 
    date.setHours(5); //this executed first instead 
    i++; 
} 

爲了證明console.log是將結果輸出到DOM而不是使用console.log一個怪,I have this code它顯示是正確的。

i = 0 
while (i < 500) { 
    date = new Date() 
    $('body').append('<div>'+i+':'+date+'</div>'); 
    date.setHours(5); 
    i++; 
} 
+0

這將是有意義的,只是我沒有運行的console.log找到這個,而是通過缺陷尋找我自己的代碼。現在,授予,也可以將其設置爲異步,但這沒有任何意義,如果我專門創建新的日期對象,情況更是如此。 – 2013-02-22 08:58:53

+0

@MarkTwine更新了答案。 – Joseph 2013-02-22 09:17:39

+0

Chrome曾經有相同的'問題'(異步console.log),但至少v24顯示控制檯上的原始日期(FF19不)。 – robertklep 2013-02-22 09:18:44