Сделать Firebug перерыв, когда определена глобальная переменная x
-
06-07-2019 - |
Вопрос
У нас очень большое 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 .