【ES6】let和const

250 阅读2分钟

ES6新增的两个命令,用于声明变量,let类似于var,const用于声明常量。

一、let

1. let声明的变量只在所在的代码块内有效

{
    let a = 10;
    var b = 1
}

a // ReferenceError: a is not defined
b // 1

代码块外调用两个变量,let声明的变量报错

2. let声明的变量不存在变量提升

var声明的变量可以在声明前使用,值为undefined,这种现象称为“变量提升”。let命令改变了这种行为,let所声明的变量一定要在声明后使用,否则会报错

image.png

var声明的变量在脚本开始运行时就已存在,但是没有值,所以输出undefined

3. 暂时性死区(Temporal Dead Zone, TDZ)

ES6规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域,只要在声明之前使用这些变量,就会报错。 image.png

4.不允许重复声明

let不允许在相同作用域内声明同一个变量

image.png

二、const命令

const声明一个只读常量,一旦声明,常量的值就不能改变,这意味着const一旦声明常量,就必须立即初始化

image.png

const本质

const实际上保证的是变量指向的那个内存地址不得改动

对于简单类型的数据(number、string、boolean)而言,值就保存在变量指向的内存地址中,因此等同于变量;对于复合类型的数据而言,变量指向的内存地址保存的只是一个指针,const只是保证这个指针是固定的,至于指向的数据结构是否可变,这完全不能控制。

image.png

三、运用场景

  • let在for循环中的运用

image.png

变量i通过var声明,则i在全局范围内有效且只有一个变量i,每次循环,变量i的值都会发生改变。当调用函数的时候,console.log(i)中的i指向全局的i,导致运行时输出的是最后一轮的i值。