Причина, по которой вы видите такие проблемы, заключается в том, что сама консоль пытается эмулировать глобальную область контекста, на который вы сейчас нацеливаете. Он также пытается захватить возвращаемые значения из операторов и выражений, которые вы пишете на консоли, чтобы они отображались как результаты. Возьмем, к примеру:
> 3 + 2
< 5
Здесь он выполняет, как будто это выражение, но вы написали его, как если бы это было заявление. В обычных сценариях значение будет отбрасываться, но здесь код должен быть внутренне искажен (например, обертывание всего оператора контекстом функции и оператором return
), который вызывает всевозможные странные эффекты, включая проблемы, которые вы испытываете ,
Это также одна из причин, почему некоторый открытый код ES6 в сценариях работает нормально, но не в консоли Chrome Dev Tools.
Попробуйте выполнить это в узле и Chrome консоли:
{ let a = 3 }
В узле или <script>
тег работает просто отлично, но в консоли, это дает Uncaught SyntaxError: Unexpected identifier
. Он также дает ссылку на источник в виде VMxxx:1
, которые вы можете нажать, чтобы проверить оценочный источник, который показывает вверх как:
({ let a = 3 })
Так почему же это сделать?
Ответ заключается в том, что ему необходимо преобразовать ваш код в выражение, чтобы результат мог быть возвращен вызывающему абоненту и отображен в консоли. Вы можете сделать это, завернув оператор в круглые скобки, что делает его выражением, но также делает блок выше синтаксически неправильным (выражение не может иметь объявление блока).
Консоль пытается исправить эти случаи краев, будучи умными по поводу кода, но я думаю, что это выходит за рамки этого ответа. Вы можете указать ошибку, чтобы убедиться, что это то, что они считают исправлением.
Вот хороший пример того, что очень похоже:
https://stackoverflow.com/a/28431346/46588
Самый безопасный способ сделать ваш код работать, чтобы убедиться, что он может работать как выражение и проверьте ссылку на SyntaxError
источник, чтобы увидеть, что фактический код выполнения и реконструировать решение из этого. Обычно это означает пару стратегически расположенных круглых скобок.
Вкратце: консоль пытается максимально точно воспроизвести глобальный контекст исполнения, но из-за ограничений взаимодействия с движком v8 и семантикой JavaScript это иногда трудно или невозможно решить.
Хороший вопрос. Обе параметризованные версии работают с Babel – CodingIntrigue
Из интереса не работает '(n => {console.log (« Ok »);})();' work? – CodingIntrigue
Да '(n => {console.log (« ОК »);})()' работает даже в консоли Chrome dev – Cristy