Сделать Firebug перерыв, когда определена глобальная переменная x

StackOverflow https://stackoverflow.com/questions/1013346

Вопрос

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

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

вместо:

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

    Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top