# let & const & var

var let const
作用域 全局作用域,挂载在window上 块级作用域
暂时性死区(块级作用域内,使用let声明变量前,该变量不可用)
变量提升 × ×
可重复声明 × ×
可再次赋值 ×

# var

  • 会变量提升(变量可以在声明前使用)
  • 允许重复声明

# let

  • 不会发生变量提升,未声明就使用会报错
  • 所声明的变量只在let命令所在的代码块(块级作用域)内有效
    • 为什么需要块级作用域?
      • 内层变量可能会覆盖外层变量(变量提升)
      • 用来计数的循环变量泄露为全局变量
  • 代码块内,使用let声明变量前出现的变量都不可用(暂时性死区
  • 不允许重复声明

# const

  • 常量一旦声明就必须立即初始化,且不能改变
  • 只在声明所在的块级作用域内有效
  • 不提升,存在暂时性死区
  • 不允许重复声明

# 顶层对象的属性

  • ES6后全局变量将逐步与顶层对象属性脱钩
    • var,function声明的全局变量依旧是顶层对象的属性
    • let,const,class声明的全局变量不属于顶层对象的属性