Powodem, dla którego występują takie problemy, jest to, że konsola próbuje emulować globalny zakres kontekstu, który jest aktualnie kierowany. Próbuje także przechwycić wartości zwracane z instrukcji i wyrażeń, które piszesz w konsoli, aby pokazać się jako wyniki. Weźmy na przykład:
> 3 + 2
< 5
Tutaj wykonuje się tak, jakby był wyrażeniem, ale napisałeś to tak, jakby było oświadczeniem. W normalnych skryptach wartość zostanie odrzucona, ale tutaj kod musi być wewnętrznie sfałszowany (jak zawijanie całej instrukcji z kontekstem funkcji i instrukcją return
), 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 niektóre kod ES6 w skryptach działa dobrze, ale nie działa w konsoli Chrome Dev Tools.
Spróbuj wykonywania tego w konsoli węzeł i Chrome:
{ let a = 3 }
w węźle lub <script>
tag to działa dobrze, ale w konsoli, to daje Uncaught SyntaxError: Unexpected identifier
. To również daje link do źródła w postaci VMxxx:1
które można kliknąć, aby sprawdzić ewaluowaną źródła, które pokazuje się jako:
({ let a = 3 })
Więc dlaczego on to zrobił?
Odpowiedź jest taka, że musi przekonwertować kod na wyrażenie, aby wynik mógł zostać zwrócony do osoby dzwoniącej i wyświetlony w konsoli. Możesz to zrobić, zawijając instrukcję w nawiasach, co czyni ją wyrażeniem, ale powoduje również, że powyższy blok jest niepoprawny pod względem składniowym (wyrażenie nie może mieć deklaracji blokowej).
Konsola stara się naprawić te skrajne przypadki, wykazując się sprytnym podejściem do kodu, ale to wykracza poza zakres tej odpowiedzi. Możesz zgłosić błąd, aby sprawdzić, czy to jest coś, co mogliby naprawić.
Oto dobry przykład czegoś bardzo podobnego:
https://stackoverflow.com/a/28431346/46588
Najbezpieczniejszym sposobem, aby swoją pracę kodu jest upewnienie się, może być prowadzony jako wyraz i sprawdzić link SyntaxError
źródłowy, aby zobaczyć, co rzeczywisty kod wykonawczy jest i odwrócić inżynier rozwiązania z tego. Zwykle oznacza parę strategicznie umieszczonych nawiasów.
W skrócie: konsola próbuje naśladować globalny kontekst wykonania jak najdokładniej, ale ze względu na ograniczenia interakcji z silnikiem V8 i semantyki języka JavaScript jest czasami trudne do rozwiązania lub niemożliwe.
Dobre pytanie. Obie sparametryzowane wersje działają z Babelem – CodingIntrigue
Nie interesująca, czy '(n => {console.log (" Ok ");})();' działa? – CodingIntrigue
Tak '(n => {console.log (" Ok ");})()' działa nawet w konsoli deweloperskiej Chrome – Cristy