本节是 let 和 const 关键字相关的考点
考点,是它背后所牵扯出的变量提升、暂时性死区等知识点
在 “var” 时代,有一个特别的现象:无论变量声明写在哪,最后都会被提到作用域的顶端。
console.log(num);var num = 1;
这段代码不会报错,反而会输出一个 undefined,因为它等价于:
var num;console.log(num);num = 1;
这是全局作用域的情况,函数作用域同理
之前学过这方面相关的知识
js 分编译阶段和执行阶段,在代码执行前都会有个短暂的编译阶段,就在这个编译阶段完成了变量声明,所以变量才会提到作用域的顶端
而 let 和 const 的一个重要特征,就是它们不存在变量提升
它们的声明生效时机和具体代码的执行时机保持一致
let 与 const 除了不存在变量提升,还和块作用域(局部作用域)有关
let 声明变量时,会绑定到块作用域上,而 var 不会感知块作用域
在函数里,var 声明的变量也只在函数作用域中有效
const 声明的变量,也会绑定到块作用域上
const 关键字还有两个特点:
注意:赋值后不可更改得分情况。
如果值是基本类型,不可更改;如果是引用类型,比如对象,修改对象的属性是可以的,但是重新赋值对象是不允许的
在上文的基础上,理解暂时性死区
var me = 'xiuyan';{me = 'bear';let me;}
这段代码运行会报错,为什么呢?
块作用域中用 let 和 const 声明的变量,该变量会被封闭在块作用域中,不会“探出头去”寻找全局变量
同时,let 声明的变量不存在变量提升,所以会报错。
因此,在这个块作用域 let 关键字前,使用 let 变量的部分,就是暂时性死区。
暂时性死区的本质:当我们进入当前作用域时,let 或者 const 声明的变量已经存在了——它们只是不允许被获取而已