es6新推出了let const塊級元素
與之前的var的主要區(qū)別以下幾點
let全局變量不再是window
let a='123'
var b='123'
console.log(window.a)//undefine
console.log(window.b)//123
塊級作用域
let a = '123'
function fun(){
console.log(a);//undefine
}
fun();
let 配合for循環(huán)的獨特應用
let非常適合用于 for循環(huán)內(nèi)部的塊級作用域。JS中的for循環(huán)體比較特殊,每次執(zhí)行都是一個全新的獨立的塊作用域,用let聲明的變量傳入到 for循環(huán)體的作用域后,不會發(fā)生改變,不受外界的影響。
for (var i = 0; i <10; i++) {
setTimeout(function() { // 同步注冊回調(diào)函數(shù)到 異步的 宏任務(wù)隊列。
console.log(i); // 執(zhí)行此代碼時,同步代碼for循環(huán)已經(jīng)執(zhí)行完成
}, 0);
}
// 輸出結(jié)果
10 共10個
// 這里面的知識點: JS的事件循環(huán)機制,setTimeout的機制等
如果把 var改成 let聲明:
// i雖然在全局作用域聲明,但是在for循環(huán)體局部作用域中使用的時候,變量會被固定,不受外界干擾。
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // i 是循環(huán)體內(nèi)局部作用域,不受外界影響。
}, 0);
}
// 輸出結(jié)果:
0 1 2 3 4 5 6 7 8 9
let沒有變量提升與let的暫時性死區(qū)
用let聲明的變量,不存在變量提升。而且要求必須 等let聲明語句執(zhí)行完之后,變量才能使用,不然會報Uncaught ReferenceError錯誤。
console.log(b);//123
console.log(a);//Uncaught ReferenceError
let a='123'
var a='123'
let const不可重復聲明
let a = 0;
let a = 'sss';
// Uncaught SyntaxError: Identifier 'a' has already been declared
const 不可重新賦值
const a ='123';
a='12345'//Uncaught TypeError: Assignment to constant variable.