声明提升
- 概念:js在执行代码之前会有一个预编译阶段,在该阶段会把声明的变量或者是函数提升到当前作用域的最顶部
变量提升
- 将变量的声明提升到当前作用域的最顶部,如果使用
var进行声明,会给变量赋值初始值undefined。如果使用let\const进行声明,会出现暂时性死区,在该区域不能访问当前变量。
(TDZ)console.log(num1);
console.log(num2);
var num1 = 1;
let num2 = 2;
function demo() {
console.log(num3);
var num3 = 3
}
demo()
函数提升
function开头定义函数,直接将函数体提升到当前作用域顶部,所以可以在顶部直接输出该函数
- 函数表达式定义函数,发生的是变量提升,把该变量提升到作用域顶部
1.console.log(demo1)
function demo1() {
console.log("demo1");
}
2.
console.log(demo2);
var demo2 = function(){
console.log("demo2");
}
demo2()
- 同名函数:如果使用
function定义函数,遵循后面的声明覆盖前面的声明,最终只保留一个函数体
console.log(demo1);
demo1()
function demo1(){
console.log("demo1 11");
}
demo1()
function demo1(){
console.log("demo1");
}
demo1()
- 函数提升和变量提升的优先级问题:函数提升高于变量提升 .但是两者的优先级都低于执行语句定义
demo()
var demo = 111;
console.log(demo);
demo();
function demo(){
console.log("demo函数");
}
函数提升和变量提升的优先级练习
function one(){
console.log(a);
a = 1
console.log(a);
var a
console.log(a);
}
one()
console.log(a);
function one() {
console.log(a);
a = 1;
console.log(a);
}
one()
console.log(a);