# ==討論日期 : 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 ```