Il motivo per cui stai riscontrando problemi come questo è che la console stessa tenta di emulare l'ambito globale del contesto al quale stai attualmente mirando. Prova anche a catturare i valori di ritorno dalle istruzioni e dalle espressioni che scrivi nella console, in modo che vengano visualizzati come risultati. Prendi ad esempio:
> 3 + 2
< 5
Qui, viene eseguito come se fosse un'espressione, ma l'hai scritto come se fosse un'affermazione. Negli script normali, il valore verrebbe scartato, ma qui il codice deve essere alterato internamente (come se si racchiudesse l'intera istruzione con un contesto di funzione e return
un'istruzione), che causa tutti i tipi di strani effetti, compresi i problemi che si verificano.
Questo è anche uno dei motivi per cui alcuni codici ES6 nudi negli script funzionano bene ma non nella console di Chrome Dev Tools.
Prova a eseguirlo nella console Node e Chrome:
{ let a = 3 }
In Node o in un <script>
tag funziona bene, ma nella console dà Uncaught SyntaxError: Unexpected identifier
. Ti dà anche un link alla fonte sotto forma di VMxxx:1
cui puoi fare clic per ispezionare la fonte valutata, che si presenta come:
({ let a = 3 })
Quindi perché lo ha fatto?
La risposta è che deve convertire il codice in un'espressione in modo che il risultato possa essere restituito al chiamante e visualizzato nella console. Puoi farlo avvolgendo l'istruzione tra parentesi, il che la rende un'espressione, ma rende anche sintatticamente errato il blocco sopra (un'espressione non può avere una dichiarazione di blocco).
La console cerca di risolvere questi casi limite essendo intelligente riguardo al codice, ma questo va oltre lo scopo di questa risposta, credo. Puoi presentare un bug per vedere se è qualcosa che potrebbero prendere in considerazione.
Ecco un buon esempio di qualcosa di molto simile:
https://stackoverflow.com/a/28431346/46588
Il modo più sicuro per far funzionare il codice è assicurarsi che possa essere eseguito come espressione e ispezionare il SyntaxError
collegamento di origine per vedere qual è il codice di esecuzione effettivo e decodificare una soluzione da quello. Di solito significa una coppia di parentesi posizionate strategicamente.
In breve: la console tenta di emulare il contesto di esecuzione globale nel modo più accurato possibile, ma a causa dei limiti di interazione con il motore v8 e la semantica JavaScript, questo è talvolta difficile o impossibile da risolvere.