Powodem, dla którego widzisz takie problemy, jest to, że sama konsola próbuje emulować globalny zakres kontekstu, na który obecnie celujesz. Próbuje również przechwycić wartości zwracane z instrukcji i wyrażeń, które piszesz w konsoli, tak aby były wyświetlane jako wyniki. Weź na przykład:
> 3 + 2
< 5
Tutaj wykonuje się tak, jakby to było wyrażenie, ale napisałeś to tak, jakby to była instrukcja. W normalnych skryptach wartość byłaby odrzucana, ale tutaj kod musi zostać zniekształcony wewnętrznie (jak zawijanie całej instrukcji kontekstem funkcji i return
instrukcją), co powoduje różnego rodzaju dziwne efekty, w tym problemy, których doświadczasz.
Jest to również jeden z powodów, dla których nagi kod ES6 w skryptach działa dobrze, ale nie działa w konsoli Chrome Dev Tools.
Spróbuj wykonać to w konsoli Node i Chrome:
{ let a = 3 }
W Node lub <script>
tagu działa dobrze, ale w konsoli daje Uncaught SyntaxError: Unexpected identifier
. Zapewnia również link do źródła, w postaci VMxxx:1
którego możesz kliknąć, aby sprawdzić oceniane źródło, które jest wyświetlane jako:
({ let a = 3 })
Więc dlaczego to zrobił?
Odpowiedź brzmi: musi przekonwertować Twój kod na wyrażenie, aby wynik mógł zostać zwrócony do wywołującego i wyświetlony w konsoli. Możesz to zrobić, zawijając instrukcję w nawiasach, co czyni ją wyrażeniem, ale także powoduje, że powyższy blok jest niepoprawny składniowo (wyrażenie nie może mieć deklaracji bloku).
Konsola próbuje naprawić te skrajne przypadki, sprytnie podchodząc do kodu, ale myślę, że to wykracza poza zakres tej odpowiedzi. Możesz zgłosić błąd, aby sprawdzić, czy to jest coś, co rozważaliby naprawienie.
Oto dobry przykład czegoś bardzo podobnego:
https://stackoverflow.com/a/28431346/46588
Najbezpieczniejszym sposobem, aby kod działał, jest upewnienie się, że można go uruchomić jako wyrażenie i sprawdzenie SyntaxError
łącza źródłowego, aby zobaczyć, jaki jest rzeczywisty kod wykonawczy, i przeprowadzić inżynierię wsteczną z tego rozwiązania. Zwykle oznacza parę strategicznie umieszczonych nawiasów.
W skrócie: konsola próbuje jak najdokładniej emulować globalny kontekst wykonania, ale ze względu na ograniczenia interakcji z silnikiem v8 i semantyką JavaScript jest to czasami trudne lub niemożliwe do rozwiązania.