web-dev-qa-db-fra.com

Chrome Erreur DevTools: "Échec de l'enregistrement dans la variable temporaire."

J'utilise Node Monkey pour déboguer mon application NodeJS.

Il arrive fréquemment que lorsque je clique sur "Stocker comme variable globale" dans ma console Chrome Console, il est dit "Échec de l'enregistrement dans la variable temporaire".

enter image description here

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

Cela arrive aussi dans ce jsfiddle

1) Suis-je en train de faire quelque chose de mal?

2) Pourquoi cela se produit-il?

Chrome: 50.0.2661.102 (64 bits) OSX El Capitan 10.11.4

29
Devid Farinelli

Je peux voir deux raisons pour lesquelles Store As Global Variable ne fonctionnerait pas:

1. Mauvais contexte de console sélectionné

Il s'agit sans doute d'un bogue Chrome, mais vous ne pouvez stocker un objet en tant que global que si la console est définie sur le même contexte que le code qui a journalisé l'objet.

Dans la pratique, cela signifie que vous devrez peut-être sélectionner l'IFrame ou le travailleur Web approprié.

Par exemple, sur jsFiddle:

Dans le contexte normal de la page de l'éditeur jsFiddle, je reçois une erreur. Mais cela fonctionne si je change le contexte pour le contenu du violon lui-même:

2. Collecte des ordures

Pour que Chrome vous donne une référence à l'objet, l'objet doit toujours être en mémoire. Si ce n'est pas le cas, il ne peut que lancer une erreur.

Cependant, je suis à peu près sûr qu'être affiché dans la console force V8 à garder une référence à la valeur.

67
Matt Zeunert

Vous devez créer l'objet dans la console elle-même, car la référence à l'objet doit être conservée par Chrome. Mettez simplement ce qui suit dans la console à la place:

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

Console

Si vous consultez cette révision où la fonctionnalité a été ajoutée, elle dit:

Ajout de la possibilité d'accéder aux objets à partir des sections ObjectPropertySections imprimées (console, volet des étendues, etc.).

Le problème, d'après ma compréhension, est que console.log génère une représentation sous forme de chaîne de l'objet et utilise simplement des formateurs d'objet pour l'afficher correctement. L'objet n'existe plus. Lorsque vous créez un objet via la console elle-même, Chrome stocke l'objet lui-même en mémoire. Si vous vous êtes arrêté sur un point d'arrêt et avez des variables de portée locale, celles-ci peuvent également être stockées globalement car elles sont aussi en mémoire.

Si vous n'avez pas de références circulaires, vous pouvez faire une chose dans votre code:

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

Dans la console, copiez la sortie et collez-la dans un JSON.parse appel:

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

La variable existe maintenant en mémoire afin que vous puissiez la stocker.

5
Gideon Pyzer