变量和函数声明提升
因为js是一门弱类型语言,在学习js时,总是有些情况让我们出乎意料。特别是变量声明提升和函数声明提升让人头疼!
例如 变量声明作用域提升
例一
console.log(a); //undefined 不会报错
var a = 5;
//等价于实际格式为
var a;
console.log(a);// undefined
a = 5;
按照我们的逻辑,应该是先执行console.log(a)先,出现报错,但是在所有代码执行之前,js解释器会将js中所有的var声明的变量提升,所以只定义了a,却没有赋值。
例二
function b() {
a = 10; //如果在函数中定义变量没有加var,该变量为全局变量 如果为
var a = 10 a 则为局部变量
return;
}
var a = 1;
b();
console.log(a);//10
//等价于实际格式为
var a = 1;
var a = 10;
var b = function(){
return;
}
console.log(a);
函数作用域提升
例如
var a = 1;
function b() {
a = 10; //函数声明提升优先级比变量声明提升优先级高
return;
//a函数声明,提前变量a,将a认为是函数b作用域的变量,具有局部效果
function a(){}
}
b();
console.log(a); // 1
//等价于实际格式
var b;
var a = 1;
b = function (){
var a ;
a = 10;
return;
a = function a(){}
}
b();
console.log(a)
按照刚刚所学的变量声明作用域提升,在函数b中,a = 10 应该被提升为全局作用域变成全局变量,但是函数作用域提升优先级比变量作用域优先级较高,所以在函数的开始就声明var a;也就促使 a = 10 不能提升为全局变量