let声明和var声明的区别
关于声明提升
var声明
<script>
console.log(num);
var num = 10;
// ==
var num;
console.log(num);
num = 10;
</script>
这时相当于只是把定义提升到前面,但没有初始化完成,会显示undefined
let声明
<script>
console.log(num);
let num = 10;
</script>
如果是let就直接报错了,因为let在声明之前就执行会进入"暂时性死区",系统就会反馈成"ReferenceRrror"
关于for循环
var声明
<script>
for (var i = 0; i < 5; i++) {
//循环逻辑
}
console.log(i); //5
</script>
<script>
for (var i = 0; i < 5; i++) {
setTimeout(() => console.log(i), 0);
}
//输出 5,5,5,5,5
</script>
for循环定义的迭代变量会渗透到循环体外部;
<script>
for (let i = 0; i < 5; i++) {
//循环逻辑
}
console.log(i); //i undefined
</script>
<script>
for (let i = 0; i < 5; i++) {
setTimeout(() => console.log(i), 0);
}
//输出 0,1,2,3,4
</script>
改用let之后,这个问题就消失了,因为迭代变量的作用域仅限于for循环的内部;