---
# System prepended metadata

title: 小組第二周JS複習

---

# ==討論日期 : 3/20 ( 三 )==

## 上週複習
- [討論日期：3/13](https://hackmd.io/@_Z8QawBcTC6y-J5Bu_f1qA/ryHvmGkRT)
- 如果口說面試時，可以盡量用文字來表達，程式碼舉例太多的面試官可能會霧煞煞
- 以提升現象來說，函式表達式會有執行階段，函式陳述式不會有
- 範例
    ```js
    function test(v){
        console.log(v) // 10
        var v = 3
    }
    test(10);

    // 相當於
    function test(v) {
        var v = 10 // 因為下面呼叫 test(10)
        var v
        console.log(v) 
        v = 3
    }
    test(10)

    // 所以印出 10
    ```
<br>
    
## 💖 本週複習 🥰

[核心篇第二堂：表達式、陳述式](https://hackmd.io/@hexschool/SyBJWo7Qs)
<br>

### 請分別解釋陳述式、表達式？

#### 相關知識點
- [什麼是表達式與陳述式？](https://hackmd.io/@MygDOT0kQmOwgykLoQpY_w/HkomCZtrK)
- [運算式與運算子](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Expressions_and_operators)
- [语句和声明](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements)
- 函式：陳述式、表達式。

#### 大家回答
表達式：
- 可以放在樣板字面值或 if 判斷裡。
- 純值、變數。
- 運算子。
- 函式表達示。
- 執行函式。
- 正規表達式。

陳述式：
- 宣告 (var、let、const 等)。
- 迴圈 (for、while)。
- 流程控制 (if...else、switch 等)。
- 其它：如 import、export... 等。

例：
```js
if (條件式) { // 條件式為 expression
    // statement
}
```
if…else 整段為陳述式


<br>


### 問題測驗 (溫馨提醒記得複習上周的唷!)

#### 題目一
```javascript=
var a = 0;
function a() {};
console.log(a)
```
解答：
```javascript
function 宣告 (函式優先執行)
var a;
a = 0;
console.log(a) // 0
```
<br>

#### 題目二
```javascript=
function b() {
  console.log(a);
  function a() {};
  var a = 3;
}
b();
```
1. f a() {}
2. undefined
3. 3

解答：`1.f a() {}`
<br>

#### 題目三
```js=
function b() {
  console.log(a);
  var a = 3;
  function a() {};
}
b();
```
解答：`1.f a() {}`
<br>

#### 題目四
```js=
function b() {
  var a = 3;
  console.log(a);
  function a() {};
}
b();
```
解答：`3`
<br>

#### 😈 延伸考題：連續賦值
```javascript=
(function () {
    var a = b = 1;
}) ();

console.log(a);
console.log(b);
```
問題：
1. a 為何錯誤？
    思考提示：作用域。
    
    答：在立即函式內宣告 var，因 var 的作用域在函式內，所以 `a` 只能在此函式內被取得。
    
    相關參考：[[Day29] 立即函式 IIFE](https://ithelp.ithome.com.tw/articles/10281585)
    
2. b 為何有值？其存在於哪裡？如何證明？
    思考提示：變數、屬性、window。
    
    答：賦值會從右到左， b = 1 會先執行，b 是全域屬性，外面也取得到。
       (賦值運算符"="為右相依性，因此從右至左返回值)


3. (bonus) function 內的變數 a 的值為？
    
    答：從右到左執行，a 被賦值 (b=1)，而 b=1 為表達式會回傳 1，同時賦值給 a 變數，所以 a 為 1。


<hr>

## 重點補充
1. 函式的提升優先於變數。
    
2. [相依性](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Operator_precedence#%E7%9B%B8%E4%BE%9D%E6%80%A7associativity)：程式碼的執行方向(右->左，左->右)

3. 連續宣告變數
    ```js=
    var a =1, b = 1;
    console.log(delete window.a);	// false
    console.log(delete window.b);	// false
    ```

4. 相同的變數名稱下，雖然後面會覆蓋前面，但當後面 **沒有賦值** 時，不會有覆蓋效果。
    - 有賦值
    ```js=
    function a() {};
    var a = 123;
    console.log(a);    // 123
    ```
    
    - 沒賦值
    ```js=
    function a() {};
    var a;
    console.log(a);    // ƒ a() { }
    ```
    
    - 有賦值，即使賦值為 `undefined`，仍會覆蓋原值。
    ```js=
    function a() {};
    var a = undefined;
    console.log(a);    // undefined
    ```




