变量的声明提升

  • 使用 var 关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值)
  • 如果声明变量时不使用 var 关键字,则变量不会被声明提升
  • 变量提升,变量提升不会覆盖(同名)函数提升,只有变量再次赋值时,才会被覆盖

    1. var a; // 声明了变量但没有赋值
    2. console.log(a);
    3. var a = 10;

    函数的声明提升

  • 使用 函数声明 创建的函数,它会在所有的代码执行之前被创建,所以可以在函数声明前调用函数

    1. // 在函数声明前调用函数,函数仍然可以调用
    2. fun(); // 函数声明
    3. function fun(){
    4. console.log("函数声明");
    5. }
  • 使用 函数表达式 创建的函数,不会被声明提升,所以不能在声明前调用

    1. n(); // 会报错:ncaught TypeError: n is not a function
    2. var n = function(){
    3. console.log("函数表达式");
    4. }

    优先级

  • 函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被变量赋值后覆盖。

例子:

var getName = function(){
    console.log(2);
}
function getName (){
    console.log(1);
}
getName();  // 1
function getName (){
    console.log(1);
}

var getName = function(){
    console.log(2);
}

getName();   // 2