JS中的变量提升

Rah*_*rma 1 javascript

我在这里对可变提升概念有点困惑。为什么第一个console.log(flag)输出undefined?它不应该捕获已经初始化的 false 值在作用域链中向上移动吗?

var flag = false;
(function(){
    console.log(flag);
    var flag = true; // JavaScript only hoists declarations, not initialisations

    console.log(flag);

    if(flag){
        let name = "John";
        const age = "24";

        console.log(name);
        console.log(age);
    }

    //console.log(name); //ReferenceError: name is not defined ( as name is block scoped here )
    //console.log(age);  //ReferenceError: age is not defined ( as age is block scoped )

})();
Run Code Online (Sandbox Code Playgroud)

kap*_*dey 6

在 JS 中,我们也有函数作用域,并且由于两个作用域中的变量名称相同,全局flag被覆盖,因此第一个 console.log(flag) 输出未定义。考虑这段代码:

(function(){
console.log(flag);
var flag = true;
})
Run Code Online (Sandbox Code Playgroud)

应用变量提升概念,这将在内部变成这样:

(function(){
var flag=undefined;
console.log(flag);
flag = true;
})
Run Code Online (Sandbox Code Playgroud)

您会因为外部作用域flag变量而感到困惑,但flag由于使用了相同的命名约定,它将被功能作用域变量覆盖。