可能的Javascript错误?
下面的代码示例:可能的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上测试过。
console.log不是异步的,它只是动态的。当您使用逗号符号记录日期对象时,您正在记录对该日期对象的实时引用,因此当它更新时,控制台显示也一样。如果您登录使用的toString相反,该值不会改变:
console.log("logging date as string, i : " i + " date : " + date);
这取决于浏览器的实现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++;
}
这将是有意义的,只是我没有运行的console.log找到这个,而是通过缺陷寻找我自己的代码。现在,授予,也可以将其设置为异步,但这没有任何意义,如果我专门创建新的日期对象,情况更是如此。 – 2013-02-22 08:58:53
@MarkTwine更新了答案。 – Joseph 2013-02-22 09:17:39
Chrome曾经有相同的'问题'(异步console.log),但至少v24显示控制台上的原始日期(FF19不)。 – robertklep 2013-02-22 09:18:44
是的,我比较了两者,看起来你是对的。尽管如此,处理事情的方式却很奇怪。绝对是值得注意的事情! – 2013-02-22 09:24:20