Сделать Firebug перерыв, когда определена глобальная переменная x - PullRequest
15 голосов
/ 18 июня 2009

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

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

вместо:

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

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

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

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

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

Ответы [ 5 ]

12 голосов
/ 18 июня 2009

При условии несколько вещей

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

этот маленький скрипт справится с задачей:

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

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

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

2 голосов
/ 29 августа 2012

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

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

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

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

2 голосов
/ 18 июня 2009

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

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

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

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

1 голос
/ 19 июня 2009

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

Warning: assignment to undeclared variable x
Source File: http://....js
Line: ##
0 голосов
/ 31 мая 2011

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

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

...