宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取
一、暂时性死区
暂时性死区也叫临时性死区(Temporal Dead Zone),TDZ。let、const声明的变量不会进行变量的提升,如果在声明前访问就会报错:
console.log(userName ) //报错ReferenceError: userName is not defined let userName = 'Sofia';
之所以报错,就是因为userName这个变量此时还存在与暂时性死区里面。
二、变量提升的好坏
好处:
1、提高性能
在预编译阶段,会统计声明的变量、函数,分配空间。
2、增强容错性
在很久很久以前,js只是用来发送表单,那时候还没调试工具,也没eslint等代码检查工具,所以需要一定的容错性。
坏处:
我们先看一段代码:
function foo() { console.log(userName) // undefined if (false) { var userName = 'Sofia'; return userName } else { return userName } } var value = foo(); console.log(value) //undefined
神奇吧!在false的情况下,变量userName被创建啦~
就是因为存在变量的提升,变量userName被提升到了函数顶部:
function foo() { var userName; console.log(userName) if (false) { userName = 'Sofia'; return userName } else { return userName } }
看着情况难受吧,难受就别用var了,拥抱let、const吧!它们更普适性,没有变量的提升。
说到let、const,不说说它们和var的区别都感觉过不去:
1、不存在变量的提升
2、暂时性死区
3、不可重复声明
4、let、const声明的变量不会被挂载到window下
5、块级作用域
问题少年:那let和const的区别呢?
1、无论是非严格模式下还是严格模式下,都不可以为const声明的常量再赋值。常量,顾名思义,不变的值。
2、const声明时必须进行初始化赋值。