JS 变量提升(hositing)

2018/8/25 posted in  JavaScript
  • 如果一个声明的变量在函数体内,那么它的作用域就是函数内部。如果是在全局环境下声明的,那么它的作用域就是全局的。通过 var 声明的变量是无法用 delete 删除的。

  • 函数内部的声明的变量会被提升到函数的头部。函数在解析执行的时候,先进行变量声明处理,然后再运行函数内部的代码。

  • 变量和赋值语句一起书写,在 JS 引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置。

  • 变量重复声明不会出错,后面的会覆盖前面的。

  • 只有声明式函数才会被提升,字面量函数不会被提升

总结

  • 函数声明会置顶

  • 变量声明也会置顶

  • 函数声明比变量声明更置顶:(函数在变量上面)

  • 变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置

  • 声明过的变量不会重复声明

  • 遗漏声明的变量是全局变量

全局对象 window

<script>
    // 在浏览器中全局对象就是window
    // 在全局作用域中声明的变量和函数声明都会作为window的属性存在。

    window.b(); // undefined

    var a = 9;

    function b() {
        console.log(a);
    }

    console.log('a' in window); // true
    console.log(window.a); // 9
    console.log(window['a']); // 9
    console.log(window.b); // f b()

    window.b(); // 9
</script>

案例1

<script>
    var a = 18;
    function d() {
        console.log(a); // undefined,使用的是函数内部的 a
        var a = { age: 19};
        console.log(a); // { age: 19}
    }
    d();
    console.log(a); // 18,使用的是全局的 a
</script>

案例2

<script>
    // ("a" in window)  => true
    if (!("a" in window)) {
      var a = 1;  // 定义了一个a变量,a =undefined,js没有块级作用域
    }
    console.log(a); // undefined
</script>

案例3

<script>
    console.log(a);  // a =>  function a() {}
    var a = 20;      // 对a进行重新赋值
    console.log(a);  // a => 20
    function a() {   // 创建global EC的VO的时候,函数的声明优先级要高于变量的声明。
    }
</script>

案例4

<script>
    f();
    console.log('b =' + b);  // 9
    console.log('c =' + c);  // 9
    console.log(a);  // 出一个异常错误,使用未定义的变量a

    function f() {
        var a = b = c = 9;  // a是局部变量,b、c是全局变量。
        // var a = 9, b = 9, c = 9;  //定义三个局部变量
        console.log(a); // 9
        console.log(b); // 9
        console.log(c); // 9
    }
</script>

案例5

<script>
    f();

    function f() {
        for (var k = 0; k < 10; k++) {
            console.log(k);// 0-9
        }
        console.log(k);// 10,JS 没有块级作用域
    }
</script>