Firefox は関数ステートメントを異なる方法で解釈し、明らかに関数宣言の宣言巻き上げを破っています。(名前付き関数/宣言と式についてよく読んでください)
Firefox がステートメントを異なる方法で解釈するのは、次のコードが原因です。
if ( true ) {
function test(){alert("YAY");}
} else {
function test(){alert("FAIL");}
}
test(); // should alert FAIL
宣言の巻き上げにより、関数test
は常に「失敗」を警告する必要がありますが、Firefox ではそうではありません。上記のコードは実際に Firefox で "YAY" を警告します。これを実現するコードが最終的に宣言の巻き上げを完全に破ったのではないかと思います。
関数宣言が if/else または try/catch ステートメントにある場合、Firefox は関数宣言を var 宣言に変換すると思います。そのようです:
// firefox interpretted code
var test; // hoisted
if (true) {
test = function(){alert("yay")}
} else {
test = function(){alert("fail")}
}
Šime Vidas との簡単な議論の後、次の理由により、Firefox の関数宣言の扱いは非標準であると言わざるを得ません。
プロダクション SourceElement:Statement は、アクションを実行せずに関数宣言のために処理されます。
プロダクション SourceElement : ステートメントは次のように評価されます。
- ステートメントを評価します。
- 結果 (1) を返します。
FunctionDeclaration と Statement の両方が SourceElements であるため、ステートメント (if/else、try/catch) 内に FunctionDeclarations があってはなりません。シメ・ヴィダスにブラウニーをあげよう!
Try/catch は基本的に if/else の別の形式であり、おそらく同じ例外コードを使用します。