2012-03-13 2 views
7

Очень странная проблема.Является ли console.dir() в javascript или firefox асинхронным?

В моей отладке я обнаружил, что console.dir (anArray) не выводил текущее значение в консоли firebug браузера.

Например,

console.dir(anArray)    //line 1 
console.log(anArray[0].prop1)  //line 2 
code to change the value of anArray[0].prop1 //line 3 

anArray представляет собой массив объектов JavaScript/JSON,

в консоли Firbug в, строка 1 выход новое значение, которое установлено в строке 3,

и строка 2 - старое значение, и это то, что я хочу.

Единственное, что объясняет, что console.dir() является асинхронным, правильно ?!

мой окр: Windows7, Firefox 6.0.2, 1.9.1 поджигатель, JavaScript Lib является DOJO (но я думаю, что не имеют ничего общего с ним.)

Спасибо.

ответ

0

Для краткости, да. :)

У меня была аналогичная проблема с Chrome в прошлом, не понимающая мой результат в консоли, но я провела несколько тестов и обнаружила, что это асинхронное поведение. На самом деле, мой лучший выбор заключается в том, что он использует internaly для setTimeout() для задержки журнала. console.log, похоже, также затронут и в моем случае.

0

Консольный журнал иногда выдает такие ошибки. Он также менее эффективен в Internet Explorer (обычное место для поиска ошибок), где он не может печатать такие вещи, как объекты и документы XML.

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

0

Это ошибка как в Firefox и Chrome: запустить в консоли:

console.log(a = {b: { c: 0}}); 
a.b.c = 1; 

результат в Firebug:

b: Object { c= 1 } 

результат в Chrome:

b: Object 
    c: 1 
2

Большая вещь с console.dir (по крайней мере, в Chrome, судя по моему опыту, и по this) является то, что расширение оценивает и показывает текущее значение объекта, в момент, когда вы делаете расширение, а не те, что в момент вызова console.dir().

Смотрите, например

<html><body> open/refresh this with the javascript console open 
<script> 
var ar = new Float32Array(1); 
ar[0]=2; 
console.log(ar[0]); 
console.dir(ar); 
ar[0]=200; 
</script> 

При развертывании массива в консоли, вы видите значение 200.

Это не должно быть ошибкой, и это, безусловно, вещь исполнения (объект может быть очень большой), но поведение странное и потенциально запутанное.

Кроме того, я проверил, что если значение изменится впоследствии, консоль не обновит его (поэтому он не работает как окно «watch» в отладчике).