为什么需要块级作用域?
第一种情况:内层变量可能会覆盖外层变量
function fn(){
console.log(a); //相当于 var a; 因为es6之前 中var 声明变量会提升
if (false) {
var a = "两个人的电影";
}
}
fn();// undefined 因为var a会 声明提升。
//---------------------
function fn(){
console.log(a);
if (false) {
let a = "两个人的电影";
}
}
fn(); //报错 a is not defined
第二种情况:循环中的计数器变量变成了全局变量。
for (var i = 0; i < 10; i++) {
console.log("abc");
}
console.log(i) //i的值会一直是10
循环中使用var和let的内存区别:
- 使用var,内存中有且只有一个i,它的值会随着循环改变
- 使用let,循环多少次就有多少个i创建,这一次循环结束了,这个i就会销毁了。
for (let i = 0; i < 10; i++) {
console.log("abc");
console.log(i);
}
块级作用域里面的变量并不影响外层函数的执行
{
let a = 20
{
let a = 10;
console.log(a);
}
console.log(a);
}
//输出 10 20