web-dev-qa-db-ja.com

Chrome DevToolsエラー:「一時変数への保存に失敗しました。」

NodeJSアプリのデバッグに Node Monkey を使用しています。

Chrome Consoleで[グローバル変数として保存]をクリックすると、「一時変数への保存に失敗しました」と表示されることがよくあります。

enter image description here

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

これもまた起こります jsfiddle

1)私は何か間違ったことをしていますか?

2)なぜこれが起こるのですか?

Chrome:50.0.2661.102(64ビット)OSX El Capitan 10.11.4

29
Devid Farinelli

グローバル変数として保存が機能しない2つの理由がわかります。

1。間違ったコンソールコンテキストが選択されました

これはほぼ間違いなくChromeバグですが、コンソールがオブジェクトを記録したコードと同じコンテキストに設定されている場合のみ、オブジェクトをグローバルとして保存できます。

実際には、これは正しいIFrameまたはWeb Workerを選択する必要があるかもしれないことを意味します。

たとえば、jsFiddleの場合:

通常のjsFiddleエディターページコンテキストでは、エラーが発生します。しかし、コンテキストをフィドル自体のコンテンツに変更すると機能します:

2。ガベージコレクション

Chromeがオブジェクトへの参照を提供するためには、オブジェクトはまだメモリ内にある必要があります。そうでない場合は、エラーをスローするだけです。

ただし、コンソールに表示されると、V8が値への参照を保持するように強制されます。

67
Matt Zeunert

オブジェクトへの参照はChromeで管理する必要があるため、コンソール自体でオブジェクトを作成する必要があります。代わりに、コンソールに次を入力してください。

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

Console

this revision 機能が追加された場所をチェックアウトすると、次のように表示されます。

印刷されたObjectPropertySections(コンソール、スコープペインなど)からオブジェクトにアクセスする機能を追加します。

私の理解に基づいた問題は、console.logがオブジェクトの文字列表現を出力し、オブジェクトフォーマッタを使用してそれをうまく表示することです。オブジェクトはもう存在しません。コンソール自体でオブジェクトを作成すると、Chromeはオブジェクト自体をメモリに保存します。ブレークポイントで一時停止し、ローカルにスコープされた変数がある場合、これらもグローバルに保存できます。また、メモリ内。

循環参照がない場合、コードでできることの1つは次のとおりです。

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?"}

変数はメモリに存在するため、保存できます。

5
Gideon Pyzer