if
内部のステートメントがbar
定義foo
されていない理由を誰かに説明してもらえますか?
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
alert(foo);
}
bar();
if
内部のステートメントがbar
定義foo
されていない理由を誰かに説明してもらえますか?
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
alert(foo);
}
bar();
// This foo is at the global level.
var foo = 1;
function bar() {
// the compiler puts in this line:
var foo;
if (!foo) {
// and the var here doesn't matter.
foo = 10;
}
alert(foo);
}
bar();
指定されたコードは次のように解析されます。
var foo = 1;
function bar() {
var foo;
if (!foo) {
foo = 10;
}
alert(foo);
}
bar();
JS には関数スコープしかなく、ブロック スコープがないため、ローカル foo は関数の先頭に持ち上げられます。「巻き上げられた」変数は、関数の外部で定義された foo よりも優先されます。これが、変数が if ステートメントで未定義である理由です。