1.基本概念
let命令:用来声明一个变量,和var非常类似
2.用let声明变量的注意事项
1)使用let声明的变量,该变量只在命令所在的代码块内有效
{
let a=1;
var b=2;
console.log(a)//正确
}
console.log(a)//报错
console.log(b)//正确
2)使用let命令声明的变量在预解析的时候不会被提升
因为存在预解析,所以a可以被访问到,是undefined
console.log(a);//undefined
var a=1;
下面则会直接报错
console.log(a);//报错
let a=1;
typeod c;//报错
let c=10;
let f=10;
function fn(){
f=7;
let f=2;//暂时性死区
}
fn();//报错
3)let不允许在同一个作用域下声明已经存在的变量,以下都会报错
var a=1;
let a;
let b=1;
let b=2;
4.let在for循环中的应用
1)看一道常见的面试题
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
<script>
var btns=document.querySelectorAll("button");
for(var i=0;i<btns.length;i++){
btns[i].onclick=function(){
console.log(i);
}
}
</script>
执行上面代码,发现无论点击哪个按钮,最终都会打印5,可以做下面的修改
for(var i=0;i<btns.length;i++){
btns[i].index=i;
btns[i].onclick=function(){
console.log(this.index);
}
}
也可以使用闭包的形式
for(var i=0;i<btns.length;i++){
(function(i){
btns[i].onclick=function(){
console.log(i);
}
})(i)
}
现在可以使用let可以直接解决这个问题
for(let i=0;i<btns.length;i++){
btns[i].onclick=function(){
console.log(i);
}
}
2)在循环语句之内是一个父作用域,在循环体之中是一个子作用域
for(let i=0;i<3;i++){
let i=10;
console.log(i);//10说明不收外面for循环的影响
}
console.log(i);//报错,未被定义。说明for循环只在循环内起作用