let、const、var的区别

25 阅读2分钟

最初在 JS 中作用域有:全局作用域、函数作用域。没有块作用域的概念。

ES6 中新增了块级作用域。块作用域由 { } 包括,if 语句和 for 语句里面的 { } 也属于块作用域。

在以前没有块作用域的时候,在 if 或者 for 循环中声明的变量会泄露成全局变量,其次就是 { } 中的内层变量可能会覆盖外层变量。块级作用域的出现解决了这些问题。

在 JavaScript 中,let、const和var是用于声明变量的三种方式,它们之间存在以下主要区别:

特性条件varletconst
作用域函数作用域块级作用域块级作用域
变量提升当前作用域有,值为 undefined有,但是由于存在暂时性死区,所以在声明之前使用会报错有,但是由于存在暂时性死区,所以在声明之前使用会报错
值的修改允许允许不允许(引用不可变)如果是对象或数组,const 声明的引用不可变,但对象的属性或数组的元素可以改变。
重复声明同一作用域允许不允许不允许
声明变量挂载window对象下全局作用域
已定义未赋值undefinedundefined报错,必须立即初始化,不能留到以后赋值

变量提升

变量提升是因为 js 需要经历编译和执行阶段。而 js 在编译阶段的时候,会搜集所有的变量声明并且提前声明变量。

可以将这个过程形象地想象成所有的声明(变量)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。

暂时性死区

当程序的控制流程在新的作用域(module、function 或 block 作用域)进行实例化时,在此作用域中用 let/const 声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。

ES6 规定,let/const 命令会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。 总之,在代码块内,使用 let/const 命令声明变量之前,该变量都是不可用的。 这在语法上,称为 “暂时性死区” ( temporal dead zone,简称 TDZ)。