一、let和const的基本比较
let | const | |
---|---|---|
作用域 | 声明所在的块级作用域 | 声明所在的块级作用域 |
适用场景 | for循环内 | 一旦声明不会改变的场景下 |
变量提升 | 不存在 | 不存在 |
暂时性死区 | Yes | Yes |
重复声明 | no | no |
常量值可变 | no(一旦声明必须立即初始化) |
二、块级作用域的函数声明
块级作用域内的函数声明,
-
行为类似于var,即会提升到全局作用域或函数作用域的头部;
-
同时,函数声明还会提升到所在的块级作用域的头部;
应尽量不在块级作用域内声明函数,如果确实需要也应写成函数表达式,而不是函数声明语句。
三、const本质
const
实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const
只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
四、顶层对象的属性
ES5 之中,顶层对象的属性与全局变量是等价的。
ES6 为了改变这一点,一方面规定,为了保持兼容性,var
命令和function
命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。