Разбить Firebug при определении глобальной переменной x

У нас очень большое приложение для JavaScript, где после многих месяцев кодирования неизбежно возникла пара всплывающих подсказок, где переменная определена без использования ключевого слова var следующим образом:

function() {  
  x = 5; ...  
}

вместо:

function() {  
  var x = 5; ...  
}

Это происходит где-то - мы не знаем, где - и поиск соответствующего имени переменной затруднен, так как это обычное слово, которое появляется в нашем источнике в 1000 раз.

Есть ли способ попросить Firebug разбить линию, которая сначала создает заданную глобальную переменную? Чтобы прояснить, я хотел бы разбить точно в тот момент, когда window.x переключается с undefined на определенное значение и прерывает оператор.

Я попытался создать выражение часов и надеялся, что смогу превратить его в точку останова, но я не могу создать часовые выражения без какого-либо контекста или области.

Если это невозможно с Firebug, меня бы интересовало все, что может сделать это в Firefox вообще.

Ответы

Ответ 1

Предоставлено несколько вещей

  • Вы знаете имя переменной
  • У вас нет переменной с этим именем в глобальной области (объявленные внешние функции), но только внутри функций.
  • Есть вызовы функции, объявляющей переменную.

этот маленький script выполнит трюк:

<script type="text/javascript">
window.__defineSetter__("x", function(value) { console.trace(); });
x = 1;
</script>

Вы получите след исполняемого кода до этого назначения.

Он может не сообщать о некоторых ситуациях, поэтому взгляните на JSLint. Загрузите все свои JS файлы прямо там и наполните их.

Ответ 2

Здесь решение, которое я использовал, изменил решение Ionut G. Stan:

window.__defineSetter__("name", function(value) {
  if (value=="div") {
    debugger;
  }
});

Я использовал debugger вместо console.trace(), поэтому я мог остановиться и посмотреть на него в середине исполнения. С помощью console.trace() я получил множество отчетов о трассировке из-за того, что эта строка выполнялась много раз.

Неверная область оказалась похожей на Dojo, где Dojo устанавливает эту переменную в имя обработанного элемента.

Ответ 3

Вот еще одно решение, которое работает только в Firefox, потому что использует специальный метод

Ответ 4

Просмотрите свою веб-страницу в браузере SeaMonkey (я использую версию 1.1.16) и посмотрю на консоль ошибок, вы увидите сообщение этого типа для каждого присваивания необъявленной переменной:

Warning: assignment to undeclared variable x
Source File: http://....js
Line: ##

Ответ 5

В дополнение к отладке, я бы посоветовал проверить ваш код JSLint, который сообщает о непредвиденных назначениях в глобальной области видимости как ошибки.

Существует несколько пакетов командной строки jslint, таких как jslint4java, которые могут использоваться кросс-платформенными в Ant создавать скрипты.