JavaScript 提升和范围

JavaScript hoisting and scope

为什么 foo() 函数记录 undefined? 第一个 text 变量是全局变量,因此 foo() 应该可以访问它。

var text = "outside";

function foo() {
    console.log(text);
    var text = "inside";
}

foo();

即使 var 语句在 console.log() 语句之后,声明也会被提升到函数的开头。所以这声明了一个局部变量来隐藏全局变量。但是在您真正到达语句之前不会发生初始化,该语句位于 console.log() 语句之后。

所以你的函数等价于:

function foo() {
    var text;
    console.log(text);
    text = 'inside';
}

如果您不使用 var 声明,那么您将继续使用全局变量,并且直到 console.log().

之后才会发生重新分配。