var、let、const的区别以及暂时性死区(重点:let和const是有变量提升的!!)

引言

相信前端八股文中的面试题大家都背烂了,问道var let const的区别时,大家经常会答

1.let,const 没有变量提升

2.块级作用域

3.重复定义、常量、是否需要有初始值

但是呢,其实真正意义上说,let和const是有变量提升的!


我们先来看一下MDN上是怎么说的

其实let和const有变量提升的,只是因为产生了“暂时性死区”,才会导致我们访问不到


那么什么是暂时性死区呢?

暂时性死区

其实简单来说就是,从代码块的开始,到执行给let变量声明并初始化的位置,会形成一个暂时性死区,在这个死区内访问这个变量,就会抛出异常。

console.log(a);
let a = 1 //抛出异常

那大家就会疑惑,你不是说有变量提升吗,这不就是没提升吗?

 其实是这样,var定义的变量,会将变量定义和变量初始化提升到代码块的顶部,其中包括了定义变量和变量初始化,初始化就是将变量赋值undefined,但是对于let和const变量来说,只是将变量的创建提升到了代码块的上方,变量并没有进行初始化,所以在代码中就产生了暂时性死区,我们访问变量就会抛出异常

1.var:变量的创建和初始化会提升到顶部

2.let,const只有变量的创建提升到顶部,并且在提升至的代码块顶部和初始化变量的位置形成了暂时性死区


var、let、const的区别

那我们回答var、let、const的区别的时候要怎么回答呢?这里给大家一个标准规范

  1. 全局污染 —— 通过var定义的变量,会挂载到window上,造成全局变量污染(不包括函数作用域中用var定义的变量)
  2. 暂时性死区—— let和const不会有传统意义上的变量提升,他们是产生了暂时性死区,我们在暂时性死区内部调用就会抛出异常
  3. 块级作用域—— 通过let和const定义的变量有块级作用域(花括号),在作用域外访问不到
  4. 重复定义,初始化赋值 —— let和const定义的变量不允许重复定义,会报错,并且const定义变量时需要有初始值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值