声明提前

var 声明变量时声明提前,并初始化成 undefined,赋值还在原来的位置。(let, const 声明时未进行初始化,不能使用
  • function 声明函数都会提前(可以在前面执行)
  • Class 没有声明提前(相当于 let 定义)(Class 也可以用表达式定义)

  • var a = 0;
    {
    a = 1; // 赋值给下面的 function a
    console.log(a, window.a); // 1,0
    // 非严格模式可以在语句块定义函数
    // 声明提前到语句块外面,函数体提前到块内最前面(且块内不能重新声明 var a),但和 var 一样执行到这里才将局部 a 的值赋值给外面的 a
    function a() {}
    console.log(a, window.a); // 1,1
    }

    foo();
    var foo = 0;
    function foo(){ console.log(1);}
    foo = function(){ console.log(2);};
    var 声明的变量和命名函数都会被提升到代码的最前面,只不过声明的变量的赋值语句在代码中的位置不变。所以上面这段代码应该被理解为:
    var foo;
    function foo(){ console.log(1);}
    foo();
    foo = 0;
    foo = function(){ console.log(2);};