es6 - let const

95 阅读1分钟

let const特点

没有变量提升

let const 声明后不会被提升

console.log(a) // a is not defined
let a = 'aaa'

重复声明报错

let a = 'bbb'
let a = 'ccc'
//Identifier 'a' has already been declared

不会绑定全局作用域

let a = 'aaa'
console.log(window.a) // undefined

var 可以绑定全局作用域

var a = 'aaa'
console.log(window.a) // aaa

产生块级作用域

在块作用域外访问let 声明的变量会报错

{
let a = 1
    var b = 2
}

a //a is not defined
b // 2

常见问题

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[0]()// 10
console.log(i) //10

var 声明的i 是在全局作用域中

var a = [];
for (let i= 0; i<10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[0]()// 0
console.log(i) // undefined

let 声明的i,只在for循环内有效,并且每次for循环会重新声明i并赋值

for循环的特别之处

for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);
}
// abc
// abc
// abc

在for 循环内部声明i并赋值,并且能输出三次,说明for循环内部的i和循环变量i不是同一个值,他们有不同的作用域

暂时性死区(temporal dead zone,简称tdz)

if(true){
	a= '小明
	let a = '小红
}

let 变量声明前会形成暂时行死区,在声明前使用变量会报错,主要为了防止未定义先使用的情况发生