详解:
在 ES6 之前我们都是通过 var
关键字定义 JavaScript 变量。ES6 才新增了 let
和 const
关键字
let
完全可以取代 var
,因为两者语义相同,而且 let
没有副作用。所以,我们在开发中建议使用 let
、 const
,不使用 var
1. 变量提升:
引擎会在解释 JavaScript 代码之前首先对其进行编译。
编译阶段中的一部分工作就是找到所有的声明,声明是在编译阶段进行的,而赋值操作等待在原地等待被执行。这就叫提升。
等价于
2. 块级作用域(ES6中新增了块级作用域):
区别:let/const
声明的变量属于块作用域,只能在其块或子块中可用。(let 和 const 声明的全局变量没有在全局对象中,只是一个块级作用域(Script)中)
而 var
声明的变量的作用域是是全局或者整个封闭函数
定义:块作用域变量在包含它们的块或 for
循环之外是不能访问的
形成方式:块作用域必须由 { } 包括,if语句和for语句里面的{ }也属于块作用域。(循环也属于块级作用域中的一种,但是ES6之前的循环不属于块级作用域)
为什么需要块级作用域:第一种场景,内层变量可能会覆盖外层变量。第二种场景,用来计数的循环变量泄露为全局变量。
ES6 规定暂时性死区和let
、const
语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量
3. 暂时性死区
只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
使用let
声明变量时,只要变量在还没有声明完成前使用,就会报错。
“暂时性死区”也意味着typeof
不再是一个百分之百安全的操作。在没有let
之前,typeof
运算符是百分之百安全的,永远不会报错
4. const不可以修改值(除了数组和对象):
const
保证的不是变量的值不得改动,而是变量指向的那个内存地址不得改动,
如果是基本类型的话,变量的值就保存在那个内存地址上,也就是常量,
如果是引用类型,它内部的值是可以变更的