函数提升和变量提升

1:函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被同名变量赋值后覆盖,注意看 赋值和打印的位置

JavaScript中的函数是一等公民,函数声明的优先级最高,会被提升至当前作用域最顶端。如果前面的函数表达式与之前的函数声明同名,后者会将其覆盖。

console.log(a) // ƒ a(){} 变量a赋值前打印的都会是函数a
var a=1;
function a(){}
console.log(a) // 1 变量a赋值后打印的都会是变量a的值

首先变量和函数声明都提升,但函数提升优先级高于变量,都提升后变量只是定义没有赋值,所以输出的是函数a。详细过程如下:

function a(){} // 函数声明提升 a-> f a (){}
var a; // 变量提升
console.log(a) // 此时变量a只是声明没有赋值所以不会覆盖函数a --> 输出函数a f a (){}
a=1; //变量赋值
console.log(a) // 此时变量a赋值了 --> 输出变量a的值 1

总结:由于函数声明和变量都会提升,如果函数与变量同名,那么只要在变量赋值前打印的都会是函数,在变量赋值之后打印都是变量的值。

 

a(); // 2
var a = function(){ // 看成是一个函数赋值给变量a(函数表达式不会被函数提升)
console.log(1)
}
a(); // 1
function a(){
console.log(2)
}
a(); // 1
只有函数声明才会提升函数表达式不会提升,所以在函数表达式后面的代码会输出1,因为变量a赋值后把提升的函数a覆盖了。详细过程如下:

function a(){ // 函数提升
console.log(2)
}
var a; // 变量提升
a(); // 2
a = function(){ // 变量a赋值后覆盖上面的函数a
console.log(1)
}
a(); // 1
a(); // 1

 

代码4

a();
function a(){
console.log(1)
}
function a(){
console.log(2)
}
打印的是2,先声明的会被后声明的覆盖。

 

代码5

var a = 0;
console.log(a)//0
if (true) {
a = 1;
console.log(a)//1
function a() {console.log('a 函数')};
a = 21;
console.log(a);//21
console.log(window.a)//1
}
console.log(window.a)//1
console.log(a);//1

解析后

var a = 0;
console.log(a)
if (true) {
a = 1;//此时的赋值将a=0覆盖 a 是全局变量
console.log(a)//输出1
function a() {console.log('a 函数')};  //声明一个函数时 相当于在判断语句里面 var a;
a = 21;//将a赋值为21 但未改变全局变量
console.log(a);//输出为21
console.log(window.a)//全局a是1
}
console.log(window.a)//全局a是1
console.log(a);//输出1

 

posted @ 2024-03-05 10:42  青橙娃娃  阅读(60)  评论(0编辑  收藏  举报