(function () {
alert (typeof foo + (typeof foo == 'undefined' ? '' : foo ()));
if (true) {
function foo () { return '#1'; }
}
else {
function foo () { return '#2'; }
}
alert (typeof foo + (typeof foo == 'undefined' ? '' : foo ()));
}) ();
ブラウザ | 1回目の alert | 2回目の alert |
---|---|---|
IE | function#2 | function#2 |
Chrome | function#2 | function#2 |
Firefox | undefined | function#1 |
DMonkey | undefined | function#1 |
true
を false
に変更した場合。
ブラウザ | 1回目の alert | 2回目の alert |
---|---|---|
IE | function#2 | function#2 |
Chrome | function#2 | function#2 |
Firefox | undefined | function#2 |
DMonkey | undefined | function#2 |
IE と Google Chrome は if/else ブロックのなかにあっても関数本体での定義として解釈され、後から記述した方(#2)が関数内全域で有効となります。
Firefox と DMonkey では、関数文が実行された時点でその関数(#1 または #2)が定義されます。