---
# System prepended metadata

title: 你所不知道的 JS 讀書筆記-02-入門-變數、條件式、嚴格模式
tags: [你所不知道的JS, javascript]

---

# 你所不知道的 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`