- 很多人認(rèn)為 var 和 let const 的區(qū)別在于,var 會(huì)變量提升,而 let const 不會(huì),雖然可以這樣認(rèn)為,但是我覺(jué)得并不完全對(duì)。
- 在 JS 引擎解析代碼的時(shí)候,遇到變量不同的聲明方式過(guò)程是不一樣的。
通過(guò) var 聲明變量的過(guò)程
console.log(a); // undefined
var a = 1;
console.log(a); // 1
- 過(guò)程:
- var 聲明的變量會(huì)提升到頂部,創(chuàng)建 a 變量。
- 創(chuàng)建完變量后會(huì)初始化 a,此時(shí)為 undefined。
- 執(zhí)行代碼,將 a 變量值賦予 a 變量。
這就是 var 變量聲明之前,輸出這個(gè)變量為 undefined 的原因了。
通過(guò) let 聲明變量的過(guò)程
{
console.log(a); // index.html:28 Uncaught ReferenceError: Cannot access 'a' before initializationat
let a = 1;
console.log(a);
}
let b = 1;
let b = 2; // Uncaught SyntaxError: Identifier 'a' has already been declared
第一個(gè)輸出結(jié)果:無(wú)法在初始化之前訪(fǎng)問(wèn) ' a '
那么 let 聲明的變量會(huì)提升嗎?
-
過(guò)程:
- let 聲明的變量在創(chuàng)建過(guò)程中被提升。
- 開(kāi)始執(zhí)行代碼,但未初始化,可以認(rèn)為在變量初始化之前,是無(wú)法使用這個(gè)變量的。
- 初始化代碼,在修改變量的前提下賦值。
第二個(gè)輸出結(jié)果:未捕獲的語(yǔ)法錯(cuò)誤:已聲明標(biāo)識(shí)符 “a”
- let 聲明的變量是無(wú)法重復(fù)聲明的。
通過(guò) const 聲明變量的過(guò)程
const a = 1;
console.log(a); // 1
a = 2; // Uncaught TypeError: Assignment to constant variable.at
重新賦值了常量變量。也就是重新修改了const聲明的變量的值。
- const 和 let 只有一個(gè)區(qū)別,就是 const 聲明的變量過(guò)程只有兩步。
- 創(chuàng)建和初始化,沒(méi)有賦值的過(guò)程。所以無(wú)法給 const 變量進(jìn)行重新賦值。
const 和 let 具有塊級(jí)作用域
{
var a = 1;
let b = 2;
const c = 3;
}
console.log(a); // 1
console.log(b); // ReferenceError: b is not defined
console.log(c); // ReferenceError: c is not defined
我們會(huì)發(fā)現(xiàn),let 和 const 只限于當(dāng)前作用域的,外部作用域時(shí)無(wú)法訪(fǎng)問(wèn)到的,那么兩者聲明的變量是屬于 window 的嗎?
var a = 1;
let b = 2;
const c = 3;
console.log(window.a); // 1
console.log(window.b); // undefined
console.log(window.c); // undefined
看完結(jié)果之后,在全局作用域中 var 和 不使用 var 聲明的變量都是屬于 window 的,而 let const 不是。