引言
相信前端八股文中的面试题大家都背烂了,问道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的区别的时候要怎么回答呢?这里给大家一个标准规范
- 全局污染 —— 通过var定义的变量,会挂载到window上,造成全局变量污染(不包括函数作用域中用var定义的变量)
- 暂时性死区—— let和const不会有传统意义上的变量提升,他们是产生了暂时性死区,我们在暂时性死区内部调用就会抛出异常
- 块级作用域—— 通过let和const定义的变量有块级作用域(花括号),在作用域外访问不到
- 重复定义,初始化赋值 —— let和const定义的变量不允许重复定义,会报错,并且const定义变量时需要有初始值