6
if(true) { 
    let m = "yo"; 

    console.log(m); 
} 

console.log(m) 

出力:JavaScriptの実行順序:この条件は、それに続くコードの後に​​なぜ実行されますか?

ReferenceError: m is not defined 
yo 

だから、4行目のコードは、ライン8

上のコードの後に​​実行されているletの私の使用量がこれを行うには何も持っていますか?

編集:コメントを読んだ後、私はこれが私のランタイムのためかもしれないことに気付きました。ここで私は毎晩Firefoxでそれを見る方法は次のとおりです。

firefox nightly let m

EDIT 2:これは確かに私のランタイムである場合には、生産コードのための含意があるため、このようなものであるのですか?ブラウザ間で動作が矛盾していますか?それをどうやって守るのですか?

+0

これはChromeで実行していますか? – Ben

+1

[私はそれを再現できません。](http://jsfiddle.net/nxzt5npp/) - 私はこれをFFの開発版で見ています。 – Andy

+0

Firefox Nightlyでこの現象が発生しました。 –

答えて

2

だから、FFランタイムの動作はOKだと思います。概要(6.2.3.1など)は、2番目のconsole.log(m)ReferenceErrorにスローされるまで、コードを1行ずつ実行する必要があることを示します。

私はコンソールが最初のconsole.logをレンダリングすることを選択したために、「面白そうに見えます」と思われます。例外メッセージ(例:Chromeの逆です)。

コンソールへのレンダリングの順序がバグかどうかにかかわらず、私は他の人に任せます。

以下は、例外が記録される前に警告が表示されていることを確認しているようです。

if(true) { 
    let m = "yo"; 

    alert(m); 
} 

console.log(m) 
+0

これはバグであることを確認できますか?私はあなたが言っていることを推測する知識は持っていません[私は実際に把握するのが難しいと思っています:-)]。おそらく私は報告書を提出するべきですか? –

+0

私は仕様の参照エラーを確認する必要があります – Ben

+2

@adityamenon参照エラー* early *を投げ、 'if'と' console.log'を実行しないでください*は*バグでした。このコードは、エラーが混乱した後にログが出力されますが、 'console'オブジェクトの実装でカバーされている可能性があります。はい、あなたはバグを報告する必要があります。なぜなら、この動作は予期せぬものですが、ES6のコンプライアンスではなくdevtoolsのコンポーネントであるからです。 (そしてあなたが行った後、ここにリンクしてください) – Bergi

関連する問題