1.说起变量提升我们首先回想起来什么呢?是var,下面我们来说说var。
var是用来定义变量,var定义的变量,变量会提升到顶部,值为undefined
console.log(num)
var num = 100;
2.那么什么是变量提升呢?
变量提升是当栈内存作用域形成时,JS代码执行前,浏览器会将带有var, function关键字的变量提前进行声明(值默认就是 undefined),定义 (就是赋值操作),这种预先处理的机制就叫做变量提升机制也叫预定义。
3.用var定义的变量分为全局变量和局部变量
全局作用域中使用var声明的变量会映射到window下成为属性,全局作用域中不带var声明变量虽然也可以但是建议带上 var声明变量,不带 var 的相当于给window对象设置一个属性罢了。
函数作用域,带var的是局部变量。不带 var 的是会向上级作用域查找,如果上级作用域也没有那么就一直找到 window 为止。
4.函数也存在变量提升
Demo() //100
function Demo() {
num = 100;
console.log(num)
}
函数一般我们都在函数底部调用 其实如果在上边调用也是可以获取到的 。
5.var let const都是声明变量的 let const不具有变量提升
let和const声明的变量具有块级作用域,var声明的变量不具有块级作用域
let和const声明的变量不可以重复声明,var声明的变量可以重复声明
let和const声明的变量具有暂时性死区
,var声明的变量则没有
暂时性死区概念:只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响
const声明的变量不可修改,let和var声明的变量可以修改