La raison pour laquelle vous rencontrez des problèmes comme celui-ci est que la console elle-même essaie d'émuler la portée globale du contexte que vous ciblez actuellement. Il essaie également de capturer les valeurs de retour des instructions et des expressions que vous écrivez dans la console, afin que les résultats apparaissent. Prenons par exemple:
> 3 + 2
< 5
Ici, il s'exécute comme s'il s'agissait d'une expression, mais vous l'avez écrit comme s'il s'agissait d'une instruction. Dans les scripts normaux, la valeur serait ignorée, mais ici, le code doit être mutilé en interne (comme envelopper l'instruction entière avec un contexte de fonction et une return
instruction), ce qui provoque toutes sortes d'effets étranges, y compris les problèmes que vous rencontrez.
C'est également l'une des raisons pour lesquelles certains codes ES6 nus dans les scripts fonctionnent correctement, mais pas dans la console Chrome Dev Tools.
Essayez de l'exécuter dans la console Node et Chrome:
{ let a = 3 }
Dans Node ou une <script>
balise ça marche très bien, mais dans la console, ça donne Uncaught SyntaxError: Unexpected identifier
. Il vous donne également un lien vers la source sous la forme VMxxx:1
duquel vous pouvez cliquer pour inspecter la source évaluée, qui apparaît comme:
({ let a = 3 })
Alors pourquoi a-t-il fait ça?
La réponse est qu'il doit convertir votre code en une expression afin que le résultat puisse être renvoyé à l'appelant et affiché dans la console. Vous pouvez le faire en entourant l'instruction entre parenthèses, ce qui en fait une expression, mais cela rend également le bloc ci-dessus syntaxiquement incorrect (une expression ne peut pas avoir de déclaration de bloc).
La console essaie de résoudre ces cas extrêmes en étant intelligente sur le code, mais cela dépasse le cadre de cette réponse, je pense. Vous pouvez déposer un bogue pour voir si c'est quelque chose qu'ils envisageraient de corriger.
Voici un bon exemple de quelque chose de très similaire:
https://stackoverflow.com/a/28431346/46588
Le moyen le plus sûr de faire fonctionner votre code est de vous assurer qu'il peut être exécuté en tant qu'expression et d'inspecter le SyntaxError
lien source pour voir quel est le code d'exécution réel et de procéder à l' ingénierie inverse d'une solution à partir de cela. Habituellement, cela signifie une paire de parenthèses stratégiquement placées.
En bref: la console essaie d'émuler le contexte d'exécution global aussi précisément que possible, mais en raison des limitations d'interaction avec le moteur v8 et la sémantique JavaScript, cela est parfois difficile voire impossible à résoudre.