「這是我參與2022首次更文挑戰(zhàn)的第4天,活動(dòng)詳情查看:2022首次更文挑戰(zhàn)」
寫在前頭
大多數(shù)小伙伴看技術(shù)書籍都會(huì)用“啃”來描述讀書的直觀感受,當(dāng)然我也是一個(gè)前端小白,白的透明那種,但是我在讀技術(shù)書籍感覺到“啃”的時(shí)候,我希望把我啃紅寶書第四版的過程的想法,總結(jié)帶給大家,以供后來者能夠更快上手。
注: 本文由于作者水平原因,如有錯(cuò)誤之處,懇請大家指正,另外隨著學(xué)習(xí)的深入,體會(huì)的加深,我會(huì)不斷回來更新,修改這類文章。
思維導(dǎo)圖

脈絡(luò) (本篇只包含3.3. 變量之3.3.1var關(guān)鍵詞)
這小節(jié)其實(shí)核心就是介紹了var,let,const 這3個(gè)變量的關(guān)鍵字,以及平時(shí)的聲明風(fēng)格,實(shí)踐。
本篇開始繼續(xù)介紹之后的內(nèi)容
3.3. 變量

3.3.2let
- let與var的區(qū)別
① 聲明范圍
上文寫到var關(guān)鍵詞聲明的是包含var關(guān)鍵詞的那個(gè)函數(shù)作用域,而let關(guān)鍵詞的作用域則是塊作用域。
什么是塊作用域,簡單來說就是一個(gè){}里面包含了let關(guān)鍵詞,他就在這個(gè){}里面起作用。其他地方無效。
②冗余聲明
和var不同,var是運(yùn)行多次聲明同一個(gè)變量,但是let只能聲明一次變量
var age;
var age; // 不會(huì)報(bào)錯(cuò)
let age;
let age; // 會(huì)報(bào)錯(cuò),使用let重復(fù)聲明name變量
補(bǔ)充:var和let可以混合使用,但是不能一起聲明一個(gè)變量
var age;
let age; // 會(huì)報(bào)錯(cuò),使用let重復(fù)聲明name變量
③聲明提升
和var不同的是,let不會(huì)聲明提升到作用域頂部。
也就是說let聲明的變量,在未聲明之前使用就會(huì)報(bào)錯(cuò)。
alert(name); // 會(huì)報(bào)錯(cuò),因?yàn)閘et聲明變量在后面。
let name = '張三';
- 暫時(shí)性死區(qū)
用人話來說就是,你知道你兒子要出生了,但是你沒有辦法抱他,親他。你在考四級(jí)時(shí),知道后面的有閱讀題,但是你必須聽完聽力才可以做,你在聽聽力期間,就是不允許去看閱讀題。簡單就是,你知道后面的變量聲明,但是你還是沒有辦法調(diào)用他。
- 全局聲明
這里涉及到全局作用域,在看紅寶書的時(shí)候就簡單理解為,var聲明的變量,可以成為對應(yīng)的window對象屬性。
let age = 1;
console.log(window.age); // undefined
var age = 1;
console.log(window.age); // 1
- 條件聲明
書中講到了使用try,catch,if語句等等來檢測代碼之前是否已經(jīng)聲明了這個(gè)變量。
但是這些都是徒勞,為什么? 因?yàn)槲覀冎纋et的作用域(文章開頭說了) 是塊級(jí)作用域。
那么在檢查到如果上文代碼中沒有聲明該變量,后面在catch塊里面,if語句塊,里面使用let聲明的變量,它的作用域就是catch塊里面,if語句塊里面,無法跳到更大的作用域。所以對let關(guān)鍵詞,條件聲明是沒有意義的。
- for 循環(huán)
滲透問題 for循環(huán)里需要注意的是let和var變量的作用域
迭代變量的奇特聲明和修改 還有就是每一次循環(huán)之后,var聲明的迭代變量就會(huì)迭代,但是let聲明的迭代變量就會(huì)及時(shí)更新變量(聲明一個(gè)新的迭代變量)。
注意:書中的setTimeout(() => console.log(i), 0); 是異步執(zhí)行的,如果使用的是var聲明變量i,確實(shí)就是等for循環(huán)結(jié)束后,在執(zhí)行這句話,也就是說會(huì)輸出5個(gè)5。
for (var i = 0; i < 5; i++ ){
console.log(i); // 輸出0,1,2,3,4 不是異步執(zhí)行的
}
3.3.3const
- const和let的區(qū)別
①初始化
首先const關(guān)鍵詞在聲明變量的同時(shí)一定要賦值,而且在賦值之后在也無法改變。
const i = 1; // i 永遠(yuǎn)就是1了,是一個(gè)常量了
②for循環(huán)
在for循環(huán)中依然要堅(jiān)持const只能聲明常量的事實(shí),換句話來說就是const不能聲明迭代變量。但是要是for循環(huán)里面需要使用一個(gè)常量,那么使用const關(guān)鍵詞來聲明在合適不過。、
for (const i = 1; i < 10; i++) // 報(bào)錯(cuò)
for (let i = 1; i < 10; i++) {
const name = '張三';
console.log(name); //不會(huì)報(bào)錯(cuò)
}
- const聲明的限制( ②③④同let一樣)
①修改變量值 記住const聲明的是常量
②重復(fù)聲明
③作用域
④限制目標(biāo) (const聲明變量引用的對象是不可以修改的,但是該對象的屬性是可以修改的)
3.3.4聲明風(fēng)格與最佳實(shí)踐
一句話,盡量不使用var,const 優(yōu)先,let 次之。書中也介紹了為什么這樣使用的理由,我就不班門弄斧介紹啦。