Отладка JavaScript Chrome: как сломаться при изменении значения
Я отлаживаю большую базу кода JavaScript, где в какой-то момент переменная "console" получает нулевое значение при обновлении страницы.
Есть ли способ установить часы на консоли и заставить JavaScript прерывать выполнение при изменении этого значения (или когда условие (console == null)
истинно)?
Я использую Chrome в Windows 7.
Ответы
Ответ 1
Ответ ниже не работает для window.console
, потому что console
(например, другие переменные среды, зависящие от браузера) обрабатывается специально. Любая попытка присвоить значение console
только "закрывает" исходное значение; он не заменяет его. Вы не можете определить, когда значение console
изменяется, но вы можете delete window.console
восстановить исходное значение, предоставленное окружением.
Для других значений используйте Object.defineProperty
, чтобы определить пользовательский сеттер для некоторого глобального window.foobar
. Функция setter запускается всякий раз, когда window.foobar
присваивается новое значение:
(function() {
var actualFoobar = window.foobar;
Object.defineProperty(window, "foobar", {
set: function(newValue) {
if(newValue === null) {
alert("someone is clobbering foobar!"); // <-- breakpoint here!
}
// comment out to disallow setting window.foobar
actualFoobar = newValue;
},
get: function() { return actualFoobar; }
});
})();
Затем поместите контрольную точку в эту функцию setter.
Этот подход будет работать для глобальных переменных или любого свойства объекта (просто измените window
на объект, у которого есть свойство).
Ответ 2
Функции, реализованные в браузере, не могут быть отменены! С технической точки зрения.
Если window.console.log
funcion был назначен null
, просто восстановите его, удалив его!
delete console.log
Это сделает работу:)
EDIT: Это не ответ на ваш главный вопрос, но я думаю, что ваш вопрос заключается в том, что вы ищете способ отладки, поэтому этот ответ в основном пропускает необходимость обнаружения изменений var.
Ответ 3
Вы не можете коснуться объекта console
... никогда, никогда. Единственное, что может случиться, это то, что переменная console
объявляется в области scope/namespace, отличной от глобальной области, скрывающей глобальную консоль. Тем не менее, вы все равно можете получить доступ к нему, используя window.console
. Помимо этого, я могу думать только об этом:
- Вы установили пользовательский агент в своих консольных переопределениях для эмуляции версии IE, которая не поддерживает
console
- Ваш код выдает ошибку из-за какой-то другой проблемы с вашим кодом.
- Как заметил @alexandernst: вы переопределяете свойство объекта консоли. Удалите метод, к которому вы не можете получить доступ, и вы в порядке.
Чтобы узнать, где вам нужно искать в коде установить условные точки останова и посмотреть пару выражений и использовать паузу на неперехваченных исключениях