let
命令所在的代码块内有效。
比如
for(let i=0;i<5;i++){}
console.log(i);//报错也就是说这个let只在for的循环体内有效。
但是用var
for(var i=0;i<5;i++){}
console.log(i);//正常打印
还有一种现象看看两者之间的区别,那就是有延时的时候。
for(var i=0;i<5;i++){
setTimeout(function(){
console.log("var"+i)
},2)
}
for(let i=0;i<5;i++){
setTimeout(function(){
console.log("let"+i)
},2)
}
var 打印的并不是我们想要的,他只打印出了最后循环结束之后的i。而let每次循环都会打印。
var 会有变量提升。即没有定义的时候可以先使用,不过此时值是undefined。但是不会报错。
console.log(b);//可以打印出undefined
var b;
b="name";
console.log(b);//可以打印出name
var b;
let就不存在变量提升,如果没定义就使用是会报错的。 Cannot access 'a' before initialization。
let存在暂时性死区。
一个块内如果定义了一个let变量那么这个变量就绑定在这个区域内了。只在这个块内有效。如果在这个区域没有定义就使用是会报错的。
var a="name";
for(){
console.log(a); //此时会报错Cannot access 'a' before initialization。即使你外面声明了一个var的a。但是这个里面又定义了一个let的a。他就以这个let为准了
let a="0"
}
let不允许在同一个作用域内重复声明
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}