Der Grund für diese Probleme ist, dass die Konsole selbst versucht, den globalen Bereich des Kontexts zu emulieren, auf den Sie gerade abzielen. Es wird auch versucht, Rückgabewerte von Anweisungen und Ausdrücken zu erfassen, die Sie in die Konsole schreiben, sodass diese als Ergebnisse angezeigt werden. Nimm zum Beispiel:
> 3 + 2
< 5
Hier wird es so ausgeführt, als wäre es ein Ausdruck, aber Sie haben es so geschrieben, als wäre es eine Aussage. In normalen Skripten würde der Wert verworfen, aber hier muss der Code intern entstellt werden (wie das Umschließen der gesamten Anweisung mit einem Funktionskontext und einer return
Anweisung), was alle möglichen seltsamen Effekte verursacht, einschließlich der Probleme, die auftreten.
Dies ist auch einer der Gründe, warum ein Teil des bloßen ES6-Codes in Skripten einwandfrei funktioniert, in der Chrome Dev Tools-Konsole jedoch nicht.
Versuchen Sie dies in der Node- und Chrome-Konsole auszuführen:
{ let a = 3 }
In Node oder einem <script>
Tag funktioniert es einwandfrei, aber in der Konsole gibt es Uncaught SyntaxError: Unexpected identifier
. Außerdem erhalten Sie einen Link zur Quelle, in dessen Form VMxxx:1
Sie klicken können, um die ausgewertete Quelle zu überprüfen. Diese wird angezeigt als:
({ let a = 3 })
Warum hat es das getan?
Die Antwort ist, dass Ihr Code in einen Ausdruck konvertiert werden muss, damit das Ergebnis an den Aufrufer zurückgegeben und in der Konsole angezeigt werden kann. Sie können dies tun, indem Sie die Anweisung in Klammern setzen, wodurch sie zu einem Ausdruck wird, der obige Block jedoch auch syntaktisch falsch ist (ein Ausdruck kann keine Blockdeklaration haben).
Die Konsole versucht, diese Randfälle zu beheben, indem sie mit dem Code klug umgeht, aber das geht meiner Meinung nach über den Rahmen dieser Antwort hinaus. Sie können einen Fehler melden, um festzustellen, ob dies behoben werden kann.
Hier ist ein gutes Beispiel für etwas sehr Ähnliches:
https://stackoverflow.com/a/28431346/46588
Der sicherste Weg, um Ihren Code zum Laufen zu bringen, besteht darin, sicherzustellen, dass er als Ausdruck ausgeführt werden kann, und den Quelllink zu überprüfen, um SyntaxError
festzustellen, wie der tatsächliche Ausführungscode lautet, und daraus eine Lösung zurückzuentwickeln. Normalerweise bedeutet dies ein Paar strategisch platzierter Klammern.
Kurz gesagt: Die Konsole versucht, den globalen Ausführungskontext so genau wie möglich zu emulieren. Aufgrund der Einschränkungen der Interaktion mit der v8-Engine und der JavaScript-Semantik ist dies manchmal schwierig oder unmöglich zu lösen.