let、const

227 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

上篇文章《你还在用var声明变量吗?》讲述了Es5之前声明变量的弊端。我们今天还探讨一下Es6新增的变量声明方式constlet

使用let声明变量

ES6为了配合constlet关键字,同时引入了块级作用域的概念。

块级作用域:代码执行时遇到花括号,会创建一个块级作用域,花括号结束,销毁块级作用域。

  1. let声明的变量不会挂载到全局对象。
  2. 在相同的作用域中不允许重复声明,在块级作用域中用定义的变量,在作用域外不能访问。
  3. 使用let不会有变量提升,因此,不能在定义let变量之前使用它底层实现上,let声明的变量实际上也会有提升,但是,提升后会将其放入到“暂时性死区”,如果访问的变量位于暂时性死区,则会报错:“Cannot access 'a' before initialization”。当代码运行到该变量的声明语句时,会将其从暂时性死区中移除。 在循环中,用let声明的循环变量,会特殊处理,每次进入循环体,都会开启一个新的作用域,并且将循环变量绑定到该作用域(每次循环,使用的是一个全新的循环变量)在循环中使用let声明的循环变量,在循环结束后会销毁

const

const和let完全相同,仅在于用const声明的变量,必须在声明时赋值,而且不可以重新赋值。
实际上,在开发中,应该尽量使用const来声明变量,以保证变量的值不会随意篡改,原因如下:

  1. 根据经验,开发中的很多变量,都是不会更改,也不应该更改的。
  2. 后续的很多框架或者是第三方JS库,都要求数据不可变,使用常量可以一定程度上保证这一点。 注意的细节:
  3. 常量不可变,是指声明的常量的内存空间不可变,并不保证内存空间中的地址指向的其他空间不可变。
  4. 常量的命名
  • 特殊的常量:该常量从字面意义上,一定是不可变的,比如圆周率、月地距地或其他一些绝不可能变化的配置。通常,该常量的名称全部使用大写,多个单词之间用下划线分割
  • 普通的常量:使用和之前一样的命名即可

在for循环中,循环变量不可以使用常量