Причина, з якою ви бачите подібні проблеми, полягає в тому, що сама консоль намагається імітувати глобальну сферу контексту, на який ви зараз орієнтовані. Він також намагається зафіксувати повернені значення з висловлювань та виразів, які ви записуєте в консоль, щоб вони відображалися як результати. Візьмемо, наприклад:
> 3 + 2
< 5
Тут він виконується так, ніби це був вираз, але ви це написали так, ніби це був вислів. У звичайних сценаріях значення буде відкинуто, але тут код повинен бути внутрішньо налаштований (як, наприклад, загортання всього оператора в контекст функції та return
висловлювання), що викликає всілякі дивні ефекти, включаючи проблеми, які виникають.
Це також одна з причин того, що якийсь голий код ES6 у скриптах працює добре, але не працює на консолі інструментів Chrome Dev Tools.
Спробуйте виконати це в консолі Node та Chrome:
{ let a = 3 }
У Node або <script>
тезі він працює чудово, але в консолі він дає Uncaught SyntaxError: Unexpected identifier
. Він також дає вам посилання на джерело, у формі VMxxx:1
якого ви можете натиснути, щоб оглянути оцінюване джерело, яке відображається як:
({ let a = 3 })
То чому це зробив?
Відповідь полягає в тому, що потрібно перетворити ваш код у вираз, щоб результат міг бути повернений абоненту і відображений у консолі. Ви можете зробити це, загорнувши оператор у круглі дужки, що робить його виразом, але він також робить блок вище синтаксично неправильним (вираз не може мати блокове оголошення).
Консоль намагається виправити ці крайові випадки, розуміючи код, але я думаю, що це виходить за межі цієї відповіді. Ви можете подати помилку, щоб побачити, чи це те, що вони могли б вирішити як виправити.
Ось хороший приклад чогось дуже схожого:
https://stackoverflow.com/a/28431346/46588
Найбезпечніший спосіб зробити ваш код - це переконатися, що він може бути запущений як вираз, і перевірити SyntaxError
вихідне посилання, щоб побачити, що таке фактичний код виконання, і реверсувати рішення з цього рішення. Зазвичай це означає пару стратегічно розміщених дужок.
Якщо коротко: консоль намагається імітувати глобальний контекст виконання якомога точніше, але через обмеження взаємодії з двигуном v8 та семантикою JavaScript це вирішити важко або неможливо.