Причина, по которой вы сталкиваетесь с подобными проблемами, заключается в том, что консоль сама пытается эмулировать глобальную область действия контекста, на который вы в настоящий момент ориентируетесь. Он также пытается получить возвращаемые значения из операторов и выражений, которые вы пишете в консоли, чтобы они отображались как результаты. Взять, к примеру:
> 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 это иногда трудно или невозможно решить.