Подтвердить что ты не робот

Отладка JavaScript Chrome: как сломаться при изменении значения

Я отлаживаю большую базу кода JavaScript, где в какой-то момент переменная "console" получает нулевое значение при обновлении страницы.

Есть ли способ установить часы на консоли и заставить JavaScript прерывать выполнение при изменении этого значения (или когда условие (console == null) истинно)?

Я использую Chrome в Windows 7.

4b9b3361

Ответ 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: вы переопределяете свойство объекта консоли. Удалите метод, к которому вы не можете получить доступ, и вы в порядке.

Чтобы узнать, где вам нужно искать в коде установить условные точки останова и посмотреть пару выражений и использовать паузу на неперехваченных исключениях