1,作用域不同
var作用域是全局作用域
let作用域是块级作用域
var a="sss"
{
let b="www"
}
console.log("aaa",a)
console.log("bbb",b)
报错
ReferenceError: b is not defined
作用域不同导致的实际应用差距:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
var b = [];
for (let i = 0; i < 10; i++) {
b[i] = function () {
console.log(i);
};
}
b[6](); // 6
当i使用var声明时,它的有效范围是全局范围,因此每一轮循环体都使用的是同一个i,直到最后i变成10退出循环。
当i使用let声明后,当前的i只能在本轮循环有效,每次循环的i其实是一个新的变量。所以let i声明方式最后输出6。
2,var有变量提升,let没有变量提升
let只能先声明再使用变量,若在声明前使用变量则报错:
console.log(dadaaa);
let dadaaa=111
ReferenceError: Cannot access 'dadaaa' before initialization
var可以在声明前使用变量,报undefined
console.log(dadbbb);
var dadbbb=222
undefined