最近、次の JavaScript コードについて、Firefox と他のブラウザーの動作の違いに気付きました。
var condition = true;
A();
function A() {
var x=0;
for(var i=0; i<10; i++) {
if(condition) {
++x;
B();
}
function B() {
console.log("B function. x = "+x);
}
}
}
Chrome、Opera、IE 出力:
B function. x = 1
B function. x = 2
B function. x = 3
B function. x = 4
B function. x = 5
B function. x = 6
B function. x = 7
B function. x = 8
B function. x = 9
B function. x = 10
Firefox の出力:
ReferenceError: B is not defined
ただし、次のように の定義を呼び出しの前に置くと、Firefox からの苦情はなく、他のブラウザーと同じ結果が得られます。function B
for(var i=0; i<10; i++) {
function B() {
console.log("B function. x = "+x);
}
if(condition) {
++x;
B();
}
}
Mozilla 開発者サイトからのこの引用に基づいています。
関数は呼び出されるときにスコープ内にある必要がありますが、関数宣言は呼び出しの下にあってもかまいません
私は電話を理解しています、A()
うまくいきます。B()
しかし、呼び出しが定義の前にある場合に、Firefox と他の呼び出しで動作に違いがある理由については明確ではありません。
原因を絞り込もうとしているときに、ここで関数の巻き上げ について読みました、Firefoxはブロック内では巻き上げを行わないと書かれていますが、私の場合はステートメント内に定義がなかったため、混乱しました。if
if