Как отладить содержимое замыкания

#javascript #google-chrome

#javascript #google-chrome

Вопрос:

Предположим, у меня есть следующий код внутри веб-страницы:

 (function() {
  var foo = 0;
  function bar() {
    foo  = 1;
  }
  bar();
})();  

Как я могу проверить значение переменной foo и / или вызвать функцию bar из консоли через некоторое время после загрузки страницы.

Я использую Google Chrome и не могу редактировать исходный код.

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

1. почему бы не вернуть функцию bar и не поместить журнал foo в тело ее функции?

2. @zb22 предположим, что я отлаживаю страницу, которую я не контролирую, поэтому я не могу редактировать код. Если бы я мог использовать инструменты разработчика Chrome для перезаписи кода, это было бы приемлемо.

3. Если вы видите это, вы можете отредактировать его (и / или поставить в нем точку останова). Я ошибаюсь?!?

Ответ №1:

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

на вашем примере:

 (function() {
  var foo = 0;
  function bar() {
    foo  = 1;
    //make the break here
  }
})();
  

вы не можете редактировать исходный js-код страницы, это сделает каждую веб-страницу открытой для взлома…

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

1. Но я не знаю, будет ли вызван / когда bar !

Ответ №2:

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

Мое решение состояло в том, чтобы поместить функцию внутри замыкания, к которой можно было получить доступ по всему миру. Это может быть сделано следующим образом:

  1. Установите точку останова внутри замыкания. При необходимости перезагрузите страницу.
  2. Когда отладчик приостановлен внутри замыкания, введите следующий код в консоли:
 window.baz = function() {
    // debugger;
    bar();
    console.log(foo);
}
  

Теперь вы можете вызывать функцию внутри консоли в любое время, и она должна иметь доступ к переменным, определенным в закрытии.


настройка точки останова и внедрение кода

выполните введенный код