Ошибка Chrome DevTools: "Не удалось сохранить временную переменную".

Я использую Node Monkey для отладки моего приложения NodeJS.

Часто бывает, что когда я нажимаю "Сохранить как глобальную переменную" в моей консоли Chrome, он говорит "Не удалось сохранить переменную temp".

введите описание изображения здесь

console.log({why:'dont', you:'work?'})

Это происходит и в этом jsfiddle

1) Я что-то делаю неправильно?

2) Почему это происходит?

Chrome: 50.0.2661.102 (64-разрядный) OSX El Capitan 10.11.4

Ответы

Ответ 1

Я вижу две причины, по которым Store As Global Variable не работает:

1. Неверный контекст консоли

Это, возможно, ошибка Chrome, но вы можете хранить объект только как глобальный, если консоль установлена ​​в том же контексте, что и код, который регистрировал объект.

На практике это означает, что вам может потребоваться выбрать правильного IFrame или веб-рабочего.

Например, на jsFiddle:

В обычном контексте страницы редактора jsFiddle я получаю сообщение об ошибке. Но он работает, если я изменяю контекст на содержимое самой скрипки:

2. Сбор мусора

Чтобы Chrome дал вам ссылку на объект, объект все еще должен находиться в памяти. Если это не так, это может вызвать ошибку.

Тем не менее, я уверен, что отображение в консоли приводит к тому, что V8 сохраняет ссылку на значение.

Ответ 2

Вам нужно создать объект в самой консоли, так как ссылка на объект должна поддерживаться Chrome. Просто добавьте следующее в консоль:

{why:'dont', you:'work?'}

Консоль

Если вы отметили эту версию, в которой была добавлена ​​функция, в ней говорится:

Добавление возможности доступа к объектам из напечатанных объектов ObjectPropertySections (консоль, область областей и т.д.).

Проблема, основанная на моем понимании, заключается в том, что console.log выводит строковое представление объекта и просто использует объектные formatters для его отображения. Объект больше не существует. Когда вы создаете объект через консоль, Chrome хранит сам объект в памяти. Если вы остановились на контрольной точке и имеют переменные с локальным охватом, они также могут храниться глобально, потому что они также находятся в памяти.

Одна вещь, которую вы могли бы сделать в своем коде, если у вас нет круглых ссылок, является:

console.log(JSON.stringify({why:'dont', you:'work?'}));
> {"why":"dont","you":"work?"}

В консоли скопируйте вывод и вставьте его в вызов JSON.parse:

JSON.parse('{"why":"dont","you":"work?"}');
> Object {why: "dont", you: "work?"}

Теперь переменная существует в памяти, поэтому вы можете ее сохранить.