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 变量声明前会形成暂时行死区,在声明前使用变量会报错,主要为了防止未定义先使用的情况发生