85-声明提升

70 阅读2分钟

声明提升

  • 概念:js在执行代码之前会有一个预编译阶段,在该阶段会把声明的变量或者是函数提升到当前作用域的最顶部

变量提升

  • 将变量的声明提升到当前作用域的最顶部,如果使用var进行声明,会给变量赋值初始值undefined。如果使用let\const进行声明,会出现暂时性死区,在该区域不能访问当前变量。
// var num1 ->undefined
// let num2  //暂时性死区
(TDZ)console.log(num1);//undefined
console.log(num2);//报错 没有初始化

var num1 = 1;
let num2 = 2;

function demo() {   
    // var num3 ->undefined  
    console.log(num3);  
    var num3 = 3
}
demo()

函数提升

  • function开头定义函数,直接将函数体提升到当前作用域顶部,所以可以在顶部直接输出该函数
  • 函数表达式定义函数,发生的是变量提升,把该变量提升到作用域顶部
1.console.log(demo1)//fn体本身
function demo1() {    
    console.log("demo1");
}

2.// demo2()//is not a function
console.log(demo2);//undefined
var demo2 = function(){   
    console.log("demo2");
}
demo2()
  • 同名函数:如果使用function定义函数,遵循后面的声明覆盖前面的声明,最终只保留一个函数体
console.log(demo1);//fn{console.log("demo1");}
demo1()//demo1

function demo1(){   
    console.log("demo1 11");
}
demo1()//demo1
function demo1(){  
    console.log("demo1");
}

demo1()//demo1
  • 函数提升和变量提升的优先级问题:函数提升高于变量提升 .但是两者的优先级都低于执行语句定义
demo()//可以执行函数
var demo = 111;
console.log(demo);//111
demo();//报错,不是一个函数
function demo(){  
    console.log("demo函数");
}

函数提升和变量提升的优先级练习

function one(){   
    // var a->undefined   
    console.log(a);//undefined   
    a = 1   
    console.log(a);//1   
    var a   
    console.log(a);//1
}
one()
console.log(a);//报错 未定义
function one() {   
    console.log(a);  //报错未定义   
    a = 1; // 全局变量  
    console.log(a);// 1
}
one()
console.log(a); // 1