# 你所不知道的 JS 讀書筆記-02-入門-變數、條件式、嚴格模式 p.44 ~ p.50 ![封面](https://i.imgur.com/XgGEzWR.jpg) ## 變數 變數名稱需要是有效的**識別字**(identifiers)以a-z、A-Z、$ 或 _ 開頭,之後可以接上任何的這些字元以及 0-9。變數名稱命名規則一般來說也適用於特性名稱。有些字不能當作變數名稱使用,被稱為**保留字**(reserved words)。 ### 函式範疇 一個變數使用`var`宣告,依據程式碼位置決定此宣告處於函式範疇或全域範疇。 #### 拉升(hoisting) 一個`var`的宣告屬於整個範疇,程式碼可以在範疇內的任何位置取用這變數,無論變數是放在該範疇第一行還是最後一行。 #### 巢狀範疇(nested scopes) 設範疇 B 在範疇 A 內,則內層的範疇 B 一樣可以取用在範疇 A 的變數,但範疇 A 無法取用範疇 B 內的變數。 ```javascript function foo() { var a = 1; function bar() { var b = 2; console.log(a); // 取用成功,結果得 1 } console.log(b); // 取用失敗,reference error } ``` 若 b 並沒有被`var`宣告,寫成`b = 2`時,在外層取用 b 的場合,b 會變成全域變數而且可以被取用,但這樣不正式的寫法不妥。 比較好的寫法是將`var b = 2`寫在外層。 ES6 新增的`let`,與`var`的巢狀範疇規則大同小異,但額外新增一些規則: `let`的宣告範疇依個別區塊`{ .. }`決定,所以像是 if 判斷式的括號裡的`let`不會被外層所取用,使程式碼更容易維護。 存在多個 if 判斷式時可以設為`let i = 0`而彼此互不衝突。 ## 條件式 除了 if 述句以外,還有`switch()`與三元運算子可以判斷條件。 ```javascript if (a == 2) { // 程式 A } else if (a == 4) { // 程式 B } else { // 程式 C } ``` 以上這段相當於 ```javascript switch (a) { case 2: // 程式 A break; case 4: // 程式 B break; default: // 程式 C ``` 三元運算子是更簡潔的單一 if..else 述句。 ```javascript var a = ( b == 2 ) ? "hello" : "world"; // 當 b 為 2 時,a 為 hello;反之,a 為 world。 ``` ## Strict 模式 讓程式碼遵循一組更嚴謹安全的原則。可以在個別函式或是整個檔案使用 strict 模式。 個別函式的場合: ```javascript function foo() { "use strict"; } ``` 整個檔案的場合: ```javascript "use strict"; function foo() { } ``` strict 模式不允許宣告變數時省略`var`。 ###### tags: `javascript` `你所不知道的JS`