变量提升和函数提升
2020-08-12 本文已影响0人
埼玉的头发
提升 (Hosting)
js代码再执行在引擎会先进行预编译,预编译期间会将变量声明和函数声明提升到当前作用域最顶端
变量提升
//变量提升
console.log(a); //undefined
var a = 3;
console.log(a);//3
//函数表达式也可以理解为变量提升
console.log(fun);//undefined
var a = 'abc';
var fun = function(){
console.log (a); //undefined
var a;// 局部作用域中的a覆盖了全局变量中的a
}
fun();
函数声明式提升
//函数声明式提升
fun(); // 'hello',由此可见整个函数声明式被提到了顶部
function fun(){
console.log('hello')
}
案例
var a = 1;
function foo() {
a = 10;
console.log(a);
return;
function a() {};
}
foo();
console.log(a);
这个案例,可能有人会第一眼看到会觉得a = 10,那不就是把全局变量改为10了吗?答案应该是10,10啊。我们仔细看,foo函数作用域末尾有一个函数声明式!它会被提升到函数作用域顶部,相当于声明了a变量,并为其赋值一个函数,所以此时的a变为了一个局部变量。
代码可拆分为
var a = 1;
function foo() {
var a = function(){};
a = 10;
console.log(a); //10 局部变量a
return;
}
foo();
console.log(a); // 1 全局变量a