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

脈絡(luò) (本篇只包含3.3. 變量之3.3.1var關(guān)鍵詞)
這小節(jié)其實核心就是介紹了var,let,const 這3個變量的關(guān)鍵字,以及平時的聲明風(fēng)格,實踐。
本篇先寫var關(guān)鍵詞
3.3. 變量

3.3.1var
- 定義變量類型不固定
簡單來說就是使用var關(guān)鍵詞聲明的變量可以存任何類型的值,就是一個盒子而已。
var name = '張三';
name = 1; // 依然是合法的,但是不推薦這么做
- 函數(shù)作用域
作用域在后面章節(jié)會介紹到,這里就簡單理解為一個函數(shù){}里面的所有內(nèi)容。
簡單來說就是使用var聲明的變量,只有在包含這個變量的函數(shù)作用域里面有效。其他地方使用會報錯。
function sayHi() {
var say = 'hi';
console.log(say);
}
sayHi(); // 調(diào)用函數(shù) 輸出hi。
console.log(say); // 報錯
- 聲明提升
就是說可以先上車后補(bǔ)票, 先用這個變量,后面在聲明也可以。var聲明的關(guān)鍵詞,他會自動把聲明的變量提升到函數(shù)作用域的頂部。
function sayHi() {
console.log(say);
var say = 'hi';
}
sayHi(); // 調(diào)用函數(shù) 輸出undefined。
為什么不輸出hi?因為var聲明的變量只會提升聲明,并不會把賦值也提升了。上面的代碼和下面的代碼等價。
function sayHi() {
var say
console.log(say);
say = 'hi';
}
sayHi(); // 調(diào)用函數(shù) 輸出undefined。這個時候say還沒有被賦值,自然就是undefined
補(bǔ)充:已經(jīng)聲明的變量且為賦值,那么他的值默認(rèn)是undefined。
- 重復(fù)聲明
多次使用var關(guān)鍵詞聲明同一個變量,都會合并為一次聲明這個變量,賦值以最后一次為準(zhǔn)確。
function say() {
var say = 'hi';
var say = 'Hi';
var say = 'Hello';
console.log(say);
}
say(); // 調(diào)用函數(shù)輸出 Hello
三次var聲明合并,最后是 var say = 'Hello';
- 省略var關(guān)鍵詞,聲明。
當(dāng)省略var 關(guān)鍵詞直接書寫一個變量名 會被視為是全局變量。并且在嚴(yán)格模式(另外一直JavaScript解析和執(zhí)行模型)這樣會報錯。
function say() {
say = 'hi'; // say 是全局變量,在函數(shù)作業(yè)域外依舊起作用
console.log(say);
}
say(); // 調(diào)用函數(shù)輸出 hi
console.log(say); // 輸出hi