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

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

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

вместо того:

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

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

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

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

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


person Maciek    schedule 18.06.2009    source источник


Ответы (5)


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

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

этот небольшой скрипт поможет:

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

Перед этим назначением вы получите трассировку выполненного кода.

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

person Ionuț G. Stan    schedule 18.06.2009
comment
Что-то не так с форматировщиком кода? Я не могу заставить его работать с моим примером. - person Ionuț G. Stan; 18.06.2009
comment
да, вам нужно добавить много пробелов перед каждой строкой, чтобы она была отформатирована - была такая же проблема с вводом моего вопроса :) - person Maciek; 18.06.2009
comment
Очень хороший подход (который работает!), И спасибо, что заставили меня открыть для себя волшебный метод _ defineSetter_. - person ; 02.05.2012
comment
См. Ответ @Maciek ниже, чтобы узнать, что сработало для него. Он использовал debugger; вместо console.trace для отладки. - person GuruM; 09.04.2013

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

Поместите этот фрагмент Javascript в самый верх вашей html-страницы сразу после тега <head>:

<script>
window.watch('x', function() { debugger });
</script>

Обратите внимание, что watch работает с любым объектом Javascript (window - это глобальный объект Javascript).

person Husky    schedule 29.08.2012

Вот решение, которое я в конечном итоге использовал, изменив решение Ионута Г. Стэна:

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

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

Оказалось, что дырявая область видимости зарыта в Dojo, где Dojo присваивает этой переменной имя обрабатываемого элемента.

person Maciek    schedule 18.06.2009
comment
Сначала я использовал отладчик, но я не видел строки, в которой была назначена переменная, поэтому подумал, что это вам не поможет. В любом случае, я рад, что смог помочь. - person Ionuț G. Stan; 18.06.2009

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

Warning: assignment to undeclared variable x
Source File: http://....js
Line: ##
person HBP    schedule 19.06.2009

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

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

person Eric Bréchemier    schedule 31.05.2011