条件ステートメント内で関数を宣言することは標準的ではないため、そうしないでください。これは既知の問題です。宣言の代わりに関数式を使用できます。
var f;
if(true) {
f = function() { alert("yes"); };
} else {
f = function() { alert("no"); };
}
f();
関数式に関する有名な Kangax の記事には、いくつかの追加の詳細が記載されています。
FunctionDeclarationsは、 ProgramまたはFunctionBodyでのみ使用できます。構文上、これらはブロック内に表示できません ({ ... })
— if
、while
またはfor
ステートメントのように。これは、ブロックにはStatementsのみを含めることができ、FunctionDeclarationであるSourceElementsを含めることができないためです。
同記事には次のようにも書かれています。
仕様に従って、実装は構文拡張(セクション 16 を参照) を導入することが許可されていますが、それでも完全に準拠していることに言及する価値があります。これはまさに、最近非常に多くのクライアントで起こっていることです。それらのいくつかは、ブロック内の関数宣言を他の関数宣言として解釈します — 単純にそれらを囲んでいるスコープの先頭に持ち上げます。その他 — 異なるセマンティクスを導入し、少し複雑なルールに従います。