3

这是代码示例:

<!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 上测试过。

4

2 回答 2

4

这将取决于浏览器的console.log. 据我所知,浏览器具有异步console.log功能,Chrome 也是如此。仅当浏览器不做任何事情时才执行异步函数。

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 = 0
while (i < 500) {
    date = new Date()
    $('body').append('<div>'+i+':'+date+'</div>');
    date.setHours(5);
    i++;
}
于 2013-02-22T08:55:02.717 回答
3

console.log 不是异步的,它只是动态的。当您使用逗号符号记录日期对象时,您正在记录对该日期对象的实时引用,因此当它更新时,控制台也会显示。如果您改为使用 toString 登录,则该值不会更改:

console.log("logging date as string, i : " i + " date : " + date);
于 2013-02-22T09:14:43.437 回答