混淆了在Javascript中提升

时间:2014-07-16 00:40:38

标签: javascript hoisting

有人可以向我解释为什么ifbar声明foo我们未定义?

var foo = 1;
function bar() {
    if (!foo) {
        var foo = 10;
    }
    alert(foo);
}
bar();

2 个答案:

答案 0 :(得分:2)

// 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();

答案 1 :(得分:2)

给定的代码将被解析如下:

var foo = 1;
function bar() {
    var foo;
    if (!foo) {
        foo = 10;
    }
    alert(foo);
}
bar();

本地foo被提升到函数的顶部,因为JS只有函数作用域而没有块作用域。 "悬挂"变量将优先于函数外部定义的foo,这就是if语句中未定义变量的原因。