函数作用域中的变量是否像全局作用域中的变量一样被提升到开头?

Are vars in a function scope hoisted to the beginning like vars in the global scope?

我找不到明确的答案,所以我会在这里试试。

编辑:这个问题不是关于一个变量是否从它所在范围的开头可用,而是我想知道这个变量是在声明全局变量时声明的,还是在函数被调用。

考虑这个例子:

var a = "foo";
function xyz(){
    var b = "bar";
}
xyz();

当我运行这段代码时,var b会被吊到哪里去?

会不会是:

declare function xyz
declare var a
assign value "foo" to var a
execute xyz()
>> declare var b
assign value "bar" to var b

或者会是:

declare function xyz
declare var a
>> declare var b
assign value "foo" to var a
execute xyz()
assign value "bar" to var b

我知道无法从全局范围访问 var b,但我很好奇这里发生的事情的顺序。

提前致谢

变量b在你执行xyz()的时候被初始化,在解释的时候没有被初始化

function host() {
  var b;
}
var a;

var aIsDeclared = true; 
var bIsDeclared = true; 

try{ a; }
catch(e) {
    if(e.name == "ReferenceError") {
        aIsDeclared = false;
    }
}

try{ b; }
catch(e) {
    if(e.name == "ReferenceError") {
        bIsDeclared = false;
    }
}

console.log("a is declared : ", aIsDeclared)
console.log("b is declared : ", bIsDeclared)