2016-06-01 15 views
16

Sto usando Node Monkey per eseguire il debug della mia app NodeJS.Errore di Chrome DevTools: "Impossibile salvare in variabile temporanea."

Accade spesso che quando faccio clic su "Memorizza come variabile globale" nella mia console Chrome, viene visualizzato il messaggio "Impossibile salvare in variabile temporanea".

enter image description here

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

Succede anche in questo jsfiddle

1) Sto facendo qualcosa di sbagliato?

2) Perché questo succede?

Chrome: 50.0.2661.102 (64-bit) OSX El Capitan 10.11.4

risposta

31

Vedo due motivi per cui deposito come variabile globale non avrebbe funzionato:

1. Contesto sbagliato Console Selected

Questo è probabilmente un bug Chrome, ma è possibile memorizzare solo un oggetto come globale se la console è impostata sullo stesso contesto del codice che ha registrato l'oggetto.

In pratica, ciò significa che potrebbe essere necessario selezionare l'IFrame o il web worker corretto.

Per esempio, su jsFiddle:

Nel normale contesto di pagina editor di jsFiddle che sto ottenendo un errore.Ma funziona se cambio il contesto per il contenuto del violino stesso:

2. Garbage Collection

Al fine di Chrome per darvi un riferimento all'oggetto l'oggetto ancora deve essere in memoria Se questo non è il caso, può solo generare un errore.

Tuttavia, sono abbastanza sicuro che la console mostrerà V8 per mantenere un riferimento al valore.

+0

Grazie! Mi aiuta (nel mio caso dovevo selezionare un iframe) –

+5

brillante, era il numero 2 per me che utilizzavo il debugger nativo – Tope

4

È necessario creare l'oggetto nella console stessa, come il riferimento all'oggetto deve essere mantenuto da Chrome. Basta mettere il seguente nella console, invece:

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

Console

Se si estrae this revision in cui è stata aggiunta la funzione, si dice:

Adding ability to access objects from printed ObjectPropertySections (console, scopes pane and etc.).

Il problema, in base alla mia comprensione, è che console.log sta emettendo una rappresentazione di stringa dell'oggetto, e semplicemente usando i formattatori di oggetti per visualizzarlo in modo corretto. L'oggetto non esiste più. Quando crei un oggetto tramite la console stessa, Chrome memorizza l'oggetto stesso nella memoria. Se si è in pausa su un punto di interruzione e si dispone di variabili con ambito locale, anche queste possono essere archiviate globalmente perché anch'esse sono in memoria.

Una cosa che si potrebbe fare nel codice, se non hai i riferimenti circolari è:

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

Nella console, copiare l'output e incollarlo in un JSON.parse chiamata:

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

La variabile esiste ora in memoria in modo da poterla memorizzare.

+0

Grazie per la tua risposta! Funziona, ma di solito "Memorizza come variabile globale" anche un oggetto stampato utilizzando un console.log, ad esempio, posso salvare l'oggetto stampato da questa pagina HTML: Il problema è che a volte questo "Store as Global Variable" non funziona e non capisco perché. –

+1

@DevidFarinelli Ho aggiornato la mia risposta per aggiungere ulteriori dettagli e una possibile soluzione per voi. –

+0

Grazie ancora a @Gideon per il tuo aiuto, è interessante. Oggi "Store as Global Variable" funziona per la mia app nodejs utilizzando console.log ({why: 'dont', you: 'work?'}) Ma non funziona per jsfiddle. Sono confuso. –

Problemi correlati