let const var关键字

letconst用于创建块级作用域

1. 不存在变量提升

  • var 在声明之前使用,值为undefined
  • letconst 在声明之前使用会报错ReferenceError
if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError
  let tmp; // TDZ结束
  console.log(tmp); // undefined
  tmp = 123;
  console.log(tmp); // 123
}

2. 存在暂时性死区

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

3. 不允许重复声明

  • var 后一个覆盖前一个
  • letconst 再次声明会报错

4. 全局变量不再属于顶层变量

var 声明的全局变量属于window属性

var d = 1;
console.log(window.d); // 1
let g = 1;
console.log(window.g); // undefined

let和const区别

  • let可以先声明再赋值 const声明时必须赋值且为常量

  • 如果是基本类型,存放的就是就是这个变量的值。但如果是引用类型,存放的是它的地址