美文网首页
Javascript 变量提升(hoisting)

Javascript 变量提升(hoisting)

作者: 韩万慧 | 来源:发表于2019-03-22 16:35 被阅读0次
    什么是作用域(scoping)

    在JavaScript中,变量的定义并不是以代码块作为作用域的,而是以函数作用作用域的。也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的。而如果该变量是定义在if 或者for这样的代码块中,它在代码块之外是可见的。另外,在JavaScript中,术语“全局变量”指的是定义在所有函数之外的变量,与之相对的是“局部变量”,所指的是在某个函数中的变量。其中,函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行。

    变量提升

    在JavaScript代码运行之前其实是有一个编译阶段的。编译之后才是从上到下,一行一行解释执行。变量提升就发生在编译阶段,它把变量和函数的声明提升至作用域的顶端。(编译阶段的工作之一就是将变量与其作用域进行关联)。
    所以对于代码var a =2;来说,编译器看到的是两行代码var a; a = 2;第一个语句是声明语句,在编译阶段处理。第二个语句是赋值语句,在运行阶段处理。

    console.log(a); var a = 3;
    // undefined
    
    screenshot.png

    为什么会出现undefined呢? 变量提升

     var x = 1;
        console.log(x); 
     if (true) {
       var x = 2;
       console.log(x); 
    }
     console.log(x);
    
    function foo() {
        var x = 1;
        if (x) {
            (function () {
                var x = 2;
                // some other code
            }());
        }
        console.log(x)
    }
    
    1. 提升的部分只是变量声明,赋值语句和可执行的代码逻辑还保持在原地不动
    2. 提升只是将变量声明提升到变量所在的变量范围的顶端,并不是提升到全局范围
    3. 变量声明和函数声明都会得到变量提升,但函数声明会最先得到提升,然后是变量声明。
    4. 对于函数声明来说,如果定义了相同的函数变量声明,后定义的声明会覆盖掉先前的声明

    以上部分也是变量提升的核心,一定要记住

    相关文章

      网友评论

          本文标题:Javascript 变量提升(hoisting)

          本文链接:https://www.haomeiwen.com/subject/axzlvqtx.html