A razão pela qual você está enfrentando problemas como esse é que o próprio console tenta emular o escopo global do contexto que você está direcionando atualmente. Ele também tenta capturar valores de retorno de instruções e expressões que você escreve no console, para que apareçam como resultados. Tomemos, por exemplo:
> 3 + 2
< 5
Aqui, ele é executado como se fosse uma expressão, mas você a escreveu como se fosse uma declaração. Em scripts normais, o valor seria descartado, mas aqui, o código deve ser mutilado internamente (como agrupar toda a instrução com um contexto de função e uma return
instrução), o que causa todos os tipos de efeitos estranhos, incluindo os problemas que você está enfrentando.
Esse também é um dos motivos pelos quais alguns códigos ES6 vazios nos scripts funcionam bem, mas não no console das Ferramentas de Desenvolvimento do Chrome.
Tente executar isso no console do Node e do Chrome:
{ let a = 3 }
No Node ou em uma <script>
tag, ele funciona muito bem, mas no console, ele fornece Uncaught SyntaxError: Unexpected identifier
. Também fornece um link para a fonte no formato no VMxxx:1
qual você pode clicar para inspecionar a fonte avaliada, que aparece como:
({ let a = 3 })
Então, por que fez isso?
A resposta é que ele precisa converter seu código em uma expressão para que o resultado possa ser retornado ao chamador e exibido no console. Você pode fazer isso colocando a instrução entre parênteses, o que a torna uma expressão, mas também torna o bloco acima sintaticamente incorreto (uma expressão não pode ter uma declaração de bloco).
O console tenta corrigir esses casos extremos, sendo esperto quanto ao código, mas acho que está além do escopo desta resposta. Você pode registrar um bug para ver se isso é algo que eles considerariam consertar.
Aqui está um bom exemplo de algo muito semelhante:
https://stackoverflow.com/a/28431346/46588
A maneira mais segura de fazer seu código funcionar é garantir que ele possa ser executado como uma expressão e inspecionar o SyntaxError
link de origem para ver qual é o código de execução real e fazer a engenharia reversa de uma solução a partir disso. Geralmente significa um par de parênteses estrategicamente posicionados.
Resumindo: o console tenta emular o contexto de execução global com a maior precisão possível, mas devido às limitações de interação com o mecanismo v8 e a semântica do JavaScript, isso às vezes é difícil ou impossível de resolver.