# let & const & var
var | let | const | |
---|---|---|---|
作用域 | 全局作用域,挂载在window上 | 块级作用域 暂时性死区(块级作用域内,使用let声明变量前,该变量不可用) | |
变量提升 | √ | × | × |
可重复声明 | √ | × | × |
可再次赋值 | √ | √ | × |
# var
- 会变量提升(变量可以在声明前使用)
- 允许重复声明
# let
- 不会发生变量提升,未声明就使用会报错
- 所声明的变量只在let命令所在的代码块(块级作用域)内有效
- 为什么需要块级作用域?
- 内层变量可能会覆盖外层变量(变量提升)
- 用来计数的循环变量泄露为全局变量
- 为什么需要块级作用域?
- 代码块内,使用let声明变量前出现的变量都不可用(暂时性死区)
- 不允许重复声明
# const
- 常量一旦声明就必须立即初始化,且不能改变
- 只在声明所在的块级作用域内有效
- 不提升,存在暂时性死区
- 不允许重复声明
# 顶层对象的属性
- ES6后全局变量将逐步与顶层对象属性脱钩
- var,function声明的全局变量依旧是顶层对象的属性
- let,const,class声明的全局变量不属于顶层对象的属性