let和const
- es5不存在块级作用域,所以在es5中,代码块中定义的变量,函数都会提升到函数顶部;es6存在块作用域,所以只在声明的代码块里有效
- 不存在变量提升,声明会绑定当前的块级作用域,在当前作用域声明之前会形成TDZ(暂时性死区)
- 在同一作用域里不允许重复声明
- const规定定义变量的内存地址保存的值不变,对于简单类型,保存的是具体值,所以相当于常量;声明的变量是数组、对象等复合类型,存储的是指向具体值的指针,所以指向不能变,但内容可变
- const声明时必须初始化
- 全局定义的const和let变量不会绑定为顶层变量的属性(global/window)
tips
- for循的头部和循环体是父子作用域关系,循环体内定义同名变量可以覆盖父作用域定义的变量
for(let i=0;i<3;i++){ console.log(i) } //0 //1 //2 for(let i=0;i<3;i++){ let i='abc' console.log(i) } //abc //abc //abc
- TDZ导致typeof不再是安全操作,在TDZ不能以任何方式引用尚未定义变量
- 隐藏的TDZ
let x=x //ReferenceError: x is not defined 在x定义前使用了x function(x=y,y=2){} //ReferenceError: y is not defined 在y定义前将y赋给x
- 块作用声明必须显示{}包裹
if(1){ let a = 1 } //正确 if(1) let a = 1 // 报错
- es6存在六种声明方式
- var
- function
- let
- const
- import
- class