Можно ли изменять значения переменной javascript во время отладки в Google Chrome?

Я отлаживаю приложение javascript (используя инструменты Chrome dev), и я хотел бы изменить некоторые значения переменных при прохождении кода.

Возможно ли это вообще?

Я пробовал и получил что-то вроде:

> modeline
1
> modeline=0
0             <<< seems to work but... 
> modeline
1             <<< ups!!

Но я не могу найти документацию, в которой говорится, что может или не может быть сделано...

Ответ 1

Почему этот ответ по-прежнему получает upvotes?

Per Mikaël Mayer ответьте, это уже не проблема, и мой ответ устарел (go() теперь возвращает 30 после того, как удалился с консолью). Это было зафиксировано в июле 2013 года, согласно отчету , приведенному выше в gabrielmaldi comment. Это тревожит меня, что я все еще получаю upvotes - заставляет меня думать, что upvoter не понимает ни вопроса, ни моего ответа.

Я оставлю свой первоначальный ответ здесь по историческим причинам, но go upvote Mikaël answer вместо.


Фокус в том, что вы не можете напрямую изменять локальную переменную, но вы можете изменять свойства объекта. Вы также можете изменить значение глобальной переменной:

var g_n = 0;
function go()
{
    var n = 0;
    var o = { n: 0 };
    return g_n + n + o.n;  // breakpoint here
}

Приставки:

> g_n = 10
  10
> g_n
  10
> n = 10
  10
> n
  0
> o.n = 10
  10
> o.n
  10

Проверьте результат go() после установки точки останова и выполнения этих вызовов в консоли, и вы обнаружите, что результат равен 20, а не 0 (но, к сожалению, не 30).

Ответ 2

Теперь это возможно в хроме 35 (сегодня по состоянию на 11 июля 2014 года). Я не знаю, какая версия разрешила это сначала.

Просто протестированный пример @gilly3 на моей машине, и он работает.

  • Откройте консоль в Sources и вкладке Snippets, добавьте новый фрагмент, вставьте в него следующий код:

    var g_n = 0; function go() { var n = 0; var o = { n: 0 }; return g_n + n + o.n; // breakpoint here }

  • Щелкните правой кнопкой мыши по имени фрагмента, нажмите "Запустить" (это не срабатывает, хотя функция)

  • Добавьте точку останова в оператор return.
  • В консоли ниже введите go()
  • и измените значения переменных, как показано ниже.

function with local modification allowed.

а возвращаемый результат g_n + n + o.n равен 30.

Ответ 4

Firebug, похоже, позволяет вам это делать.

Ответ 5

Похоже, что нет.

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

Ответ 6

На самом деле существует обходное решение. Скопируйте весь метод, измените его имя, например. originalName() в originalName2(), но измените переменную внутри, чтобы взять любое значение, которое вы хотите, или передать его как параметр.

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

Если метод вызывается автоматически, то вместо этого введите в консоль

originalName = null;
function originalName(original params..)
{
    alert("modified internals");
    add whatever original code you want
}

Ответ 7

Я могу изменить значение переменной script путем назначения в консоли. Простейший.

Ответ 8

Я не знаю, почему команда chrome не допускает эту глупую функцию... но единственным способом, с помощью которого я мог с успехом изменить переменные значения, является изменение script непосредственно в редакторе chrome в вкладке "Источники" ( это изменяет поведение вашего script, пока вы не обновите страницу), но изменения будут потеряны при обновлении, поэтому будьте осторожны.

Ответ 9

У меня была такая же проблема, я пошел в "О Google Chrome" → Справка, и он сказал, что мне нужно перезагрузить браузер, чтобы получить последние обновления.

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

Я заметил некоторые странности, хотя мне пришлось перешагнуть некоторые несвязанные назначения var, прежде чем я смог изменить текст в правом окне (Scope Variables).