- 定义:将声明移动到顶部的默认行为,即变量可以在声明之前使用
- 作用:提高性能,提高容错性
- 在es6之前 ,JavaScript作用域分为全局作用域(变量可全局使用)和函数作用域(变量只能在函数内部使用),使用变量提升可以解决块级作用域,但是出现了占用内存和变量覆盖的问题
- 变量覆盖例子
//由于变量提升,浏览器预解析如下
/*var name = undefined
function f(){
var name = undefined
}*/
var name = "时间"
f();
function f(){
/函数调用时会将先输出函数内部的name变量
console.log(name);//undefined
if(1){
var name= "金钱"//如果函数内部没有这个变量定义,则调用函数的时候会往上一级查找name变量进行输出
}
console.log(name);//金钱
}
- 占用内存例子
function f(){
for(var i = 0; i < 2; i++){
console.log(i)//0、1
}
//此时i没有被销毁,占用了内存
console.log(i)//2
}
- es6提出的let和const不支持变量提升,解决了变量提升带来的问题