2013-02-22 41 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