2016-03-24 1 views
4
if (true) { 
    function test() { 
    console.log(true); 
    } 
} else { 
    function test() { 
    console.log(false); 
    } 
} 

test() 

Chrome 48(およびノー​​ド< 5.9.1)はfalseを記録し、chrome 49(およびfirefox)はtrueを記録します。私は彼らが偽のブランチから吊り上げないように最適化したと思うが、それは既存のアプリケーションを破る可能性がある。
仕様によって正しいのはどちらですか?クロム48と49の間で巻上げ動作が変更されましたか?

+1

このように、Chrome 49では、このように関数を宣言するためのサポートが追加されています。このように書かれたコードは、以前のバージョンのChromeで意図したとおりに動作していない可能性があります。彼らは働いていたが、実際にはすでに壊れていた。 –

答えて

2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/functionによると、ECMAScript標準では、クロム49が実行しているように見える条件付き作成のブロック文で関数宣言を再ホイストします。

しかし、ECMAScript 6以前では、条件付きブロックの関数宣言の動作は定義されていませんでした。ブラウザは条件付き作成メカニズムを使用して、最初に(または最後に)いずれかの機能を呼び出すことはなく、test();にエラーを返すか、またはJavaScriptに関連しないものを実行してコンピュータを起動させる可能性があります。

関連する問題