前言
距上次更新已經八個多月,除了工作上學到的新東西,
好像沒有當初自學時的那股衝勁與熱情。
我還是覺得前端的一切很好玩,
但怎麼說呢…
有聽人說過,你知道五六年前是沒有前端工程師這職位的,技術變更很快,前端是學不完的,如果只會在原地踏步,三五年後可能也無法生存。
所以我不想耍廢,但也不知道要寫什麼,就從些基本的開始,累積點東西吧!
先說結論
不要用var
現在的工作專案上,已經很少看到var了(至少我工作上沒用過),比起var,盡量使用let、const,可以避免掉全域汙染、重複宣告…等很多不必要的麻煩。
宣告
在程式裡,會大量使用到變數,要使用變數就要先執行宣告。
1 | console.log(foo); //'foo is not defined' 沒有被宣告所以不認識 |
為什麼用let 不用var
1.全域變數、區域變數
1 | var a = 10; //全域性作用 |
2.block-level scope(塊級作用域)
1 | function foo() { |
let 是塊級作用域,簡言之,他是存在於”{}”內的,像是if,while…等用到”{}”判斷、迴圈之類的,跟function的函示作用域不同
3.沒有hoising(變量提升)
1 | console.log(foo); //'foo is not defined' |
剛剛有提到在程式中要用到變數就需要先宣告,我要使用到foo(範例用的變數名稱),如果沒有先宣告的就會會跑出foo is not defined報錯訊息,意思是這個foo並沒有被定義過,程式不認識foo
1 | var foo; |
foo被宣告了以後,就可以取用,不過還沒賦予值的foo會跑出foo is undefined的警告訊息,並不會報錯
如果不按順序宣告呢
1 | console.log(foo); |
剛剛學到了要先宣告foo才能取用,不然會出現foo is not defined
結果是
.
.
.
1 | console.log(foo); //'foo is undefined' |
只要有宣告,就會把變數提升到最上面,不管先後順序都可以呼叫到,這就是hoising變量提升),不過賦值並不會跟著提升。
換作是let呢
.
.
.
1 | console.log(foo); //'Uncaught ReferenceError: Cannot access 'foo' before initialization' |
這是什麼東東
.
.
.
temporal dead zone, TDZ (暫時性死區)
let沒有hoising(變量提升),使用let時會使區塊形成封閉的作用域,換句話說
在還沒宣告以前都不能使用它
1 | console.log(foo); //'Uncaught ReferenceError: Cannot access 'foo' before initialization' |
4.不允許重複宣告
1 | var foo = 10; |
foo已經用var宣告過了,又可以重複宣告不會報錯
1 | let foo = 10; //我在這裡是唯一的foo,不准覆蓋我 |
使用let宣告後的變數,如果重複宣告會報錯,因此使用let可以避免掉重複取名覆蓋掉變數的問題。
const
const 特性與let大多相似,但
1.一定要有值
1 | const myLuckyNumber; //Assignment to constant variable. |
宣告時一定要賦予值
2.不可重複賦予值
1 | const myLuckyNumber = 7 |
const為’常數’,不可重複賦予值與宣告,所以通常是用來放不會變的值,我的幸運數字是’7’不會變。
3.物件依然是參考
1 | const person = { |
剛剛第二點不是說’不可重複賦予值’,怎麼又可以更改裡面的值,那是因為物件是傳參考(by reference)而非傳值(by value),所以在此依然可以修改屬性
1 | const person = { |
不能重複指定值、但依然可以修改屬性。
小結
這主題應該是很多人的第一篇文,都看到爛了,但自己實際下來寫感覺又很新奇。
在工作上很多用法都已經習以為常,知道怎麼使用這些宣告,對專案比較好,但如果突然我問我差別或是以上這些東西,一時間還真的會呆滯個幾秒鐘,不知道怎麼解釋,這就是為什麼要自己整理一遍,雖然是基本的東西,但底層越穩健,累積起來對以後整個思考的邏輯會很有幫助。
如果本篇有哪個地方有誤,歡迎指教:)
想看更詳細的解說可以點擊下方參考資料。
參考資料
Summer。桑莫。夏天:ES6: let, const, Block-Level Scope
EddyChang:理解ES6中的暫時死區(TDZ)
坤小:var与let区别-详解块级作用域与局部作用域
卡斯伯:ES6 開始的新生活 let, const