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