Проблемы с ключевым словом и областью действия JavaScript Debugger

#javascript #google-chrome #debugging

#javascript #google-chrome #отладка

Вопрос:

Я заметил некоторое странное поведение при использовании ключевого слова debugger в Chrome 35 (см. Фрагмент ниже или JSFiddle):

 function Person (settings) {
    // ....
    settings.init();
}


var anchors = document.querySelector('a');
var bob = new Person({
    init: function () {
        debugger;
    }
});
  

Я заметил, что проверка значения ‘anchors’ в консоли в точке останова отладчика возвращала ошибку ReferenceError, указывающую, что anchors не определен. Однако, когда я проверил привязки к точке останова отладчика этого фрагмента (JSFiddle):

 function Person (settings) {
    // ....
    settings.init();
}


var anchors = document.querySelector('a');
var bob = new Person({
    init: function () {
        debugger;
        console.dir(anchors);
    }
});
  

возвращены якоря, null что является разумным значением для document.querySelector возврата. anchors, скорее всего, существует в области действия анонимной функции. Это ошибка в Chrome или ожидаемое поведение?

Комментарии:

1. Я полагаю, если я не ошибаюсь, это связано со сборкой мусора. Поскольку anchors на него больше нигде нет ссылок, он не сохраняет его. Обратите внимание, что если вы измените вызов функции после debugger на что-либо, кроме eval или любого оператора, который не ссылается, anchors он не будет отображаться anchors как определенный. Но как только вы вводите eval вызов или ссылку на вызов, anchors затем отображается как определенное значение null. anchors

2. @PatrickEvans но если анонимная функция не содержала ссылок на якоря, и я поставил фактическую точку останова в строке функции, тогда якоря были бы доступны мне, когда я регистрирую их в консоли или просматриваю. Ключевое слово debugger не функционирует как обычная точка останова?

3. Что ж, продолжая тестирование, моя теория сборки мусора неверна. Но мой список наблюдения не отображается anchors как определенный, когда он остановлен в init функции или в закрытии, которое на него не ссылается. Таким образом, это может быть ожидаемым поведением, поскольку на него нет ссылки, отладчик не утруждает себя просмотром его или перечислением в переменных области видимости. Но это тоже всего лишь теория, я пока ничего не нашел, что объясняло бы такое поведение.