var和let的区别:
1、var具有变量提升能力,不管在哪里声明均视为作用域顶部声明
2、let声明不具备变量提升能力,离开区块的作用域后,则失效
3、let适合局部变量
4、let带来的区别:声明之前使用时,产生的结果不同
{
var v=10;
let c=20;
}
console.log(v);//10
console.log(c);//引用错误
效果:
console.log(v);//undefined
var v;//变量提升导致逻辑怪异
console.log(c);//引用错误
let c;//变量提升导致逻辑怪异
// 在一个区域内部只要使用let声明,这个区域就形成了封闭的作用域
效果:
临时死区 简称TDZ 使用typeof也会报错
if(true){
// // 死区开始
v=10;
console.log(v);
//死区结束
let v;
}
typeof判断未声明的变量 会直接报错 就算其中一个是var 会直接输出undefined
console.log(typeof v);
如果声明 let v;就会报错 必须声明在前面
let v=10;
var v=20;//报错,更换顺序报错
console.log(v);
两个let报错,let和var各一个也报错,只要有let就不能重复声明同一个变量
如果在一个作用域外部,一个在内部,则可以并存
let v=10;
{
console.log(v);//不建议相同,会乱
}
在循环中的区别:let只在内部有效,var全局有效,后续会有干扰,let没有
for(var i=0;i<10;i++){
console.log(i);
}
for(let i=0;i<10;i++){
console.log(i);
}
var list=[];
for(var i=0;i<10;i++){//这里改成let,会得到想要的值
list[i]=function(){
console.log(i);
}
}
list[5]();//不管设置多少,都是10