このような問題が発生する理由は、コンソール自体が現在対象としているコンテキストのグローバルスコープをエミュレートしようとするためです。また、コンソールに書き込んだステートメントや式からの戻り値をキャプチャして、結果が表示されるようにします。例えば:
> 3 + 2
< 5
ここでは、式のように実行されますが、ステートメントのように記述しました。通常のスクリプトでは値は破棄されますが、ここではコードを内部でマングルする必要があります(ステートメント全体を関数コンテキストとステートメントでラップするなどreturn
)。これにより、発生している問題を含め、あらゆる種類の奇妙な影響が発生します。
これは、スクリプト内の一部の裸のES6コードが正常に機能するがChrome Dev Toolsコンソールでは機能しない理由の1つでもあります。
NodeとChromeコンソールでこれを実行してみてください:
{ let a = 3 }
ノードまたは<script>
タグでは問題なく機能しますが、コンソールではが得られUncaught SyntaxError: Unexpected identifier
ます。また、ソースへのリンクが表示されます。このリンクをVMxxx:1
クリックすると、評価されたソースを検査できます。次のように表示されます。
({ let a = 3 })
それで、なぜこれをしたのですか?
その答えは、コードを式に変換して、結果を呼び出し元に返し、コンソールに表示できるようにする必要があるということです。これを行うには、ステートメントを括弧で囲み、式を作成しますが、上記のブロックを構文的に不正確にします(式にブロック宣言を含めることはできません)。
コンソールはコードを賢くすることでこれらのエッジケースを修正しようとしますが、それはこの回答の範囲を超えていると思います。バグを報告して、修正を検討する必要があるかどうかを確認できます。
これは非常によく似た良い例です:
https://stackoverflow.com/a/28431346/46588
コードを機能させる最も安全な方法は、コードを式として実行できることを確認し、SyntaxError
ソースリンクを調べて実際の実行コードを確認し、そこからソリューションをリバースエンジニアリングすることです。通常は、戦略的に配置された一対の括弧を意味します。
要するに:コンソールは正確にできるだけグローバル実行コンテキストをエミュレートしようとしますが、相互作用の制限のためにV8エンジンを持つとJavaScriptセマンティクスこれは時々解決するのは難しいまたは不可能です。