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

Консоль поджигатель в конце концов выводит дату установки на 5 часов, а не оригинал, неизмененный дату. Я тестировал это только на Firefox 17.

ответ

3

console.log не является асинхронным, он просто динамический. Когда вы регистрируете объект даты с использованием нот запятой, вы регистрируете живую ссылку на этот объект даты, поэтому, когда она обновляется, отображается и консоль. Если вы выполнили вход с помощью команды toString, значение не изменилось:

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

Да, я сравнил их, и кажется, что ты прав. Тем не менее, довольно причудливый способ справиться с вещами. Определенно, что нужно следить в будущем! –

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 является тот виноват, I have this code, который выводит результат в DOM вместо использования console.log и он показывает это право.

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

Это имело бы смысл, за исключением того, что я не нашел этого, запустив console.log, а скорее из-за поиска ошибок в моем собственном коде. Теперь, предоставленный, это может быть также установлено async, но это не имеет никакого смысла, более того, если я специально создаю новый объект даты. –

+0

@MarkTwine обновил ответ. – Joseph

+0

В Chrome используется одна и та же «проблема» (async console.log), но по крайней мере v24 показывает исходную дату на консоли (FF19 - нет). – robertklep

Смежные вопросы