# 🏅 Day 3 - 函式
今天的每日任務,我們先來重溫一下 JavaScript 在宣告函式的兩種方式,分別為:
1. **函式陳述式(Function Declaration)**:傳統的函式定義方式。
2. **函式表達式(Function Expression)**:將函式賦值給變數的方式。
## 函式陳述式
函式陳述式它以 **`function`** 關鍵字當作開頭,後面接著函式名稱與對應程式碼。
**主要特性有:**
1. 函式名稱是必需的
2. 函式會被提升 **Hoisting (提升)**
**範例程式碼**:
```tsx=
console.log(add(5, 3)); // 會被提升,所以仍會輸出: 8
function add(x, y){
return x + y;
}
console.log(add(5, 3)); // 輸出: 8
```
## **函式表達式(Function Expression)**
函式表達式是將函式定義為表達式的一部分,通常是將函式賦值給變數。可以是匿名的(沒有函式名稱)或具名的。唯一的差別在,函式表達式不會被提升,所以只能在函式被賦值之後才能執行。
**主要特性有**:
1. 可以是匿名也可以是具名。
2. 不會被提升,需要在定義之後才能執行。
**範例程式碼**:
```tsx=
console.log(subtract(10, 5)); // 會出錯,Uncaught ReferenceError: subtract is not defined
const subtract = function(x, y) {
return x - y;
};
console.log(subtract(10, 5)); // 輸出: 5
```
## 函式的型別註釋
接下來我們就來分享,在 TypeScript 中如何針對函式加上型別註釋吧!
你可以為函式的參數和回傳值加入型別註釋:
1. **參數型別**:定義每個參數的型別。
2. **回傳值的型別**:定義函式回傳值的型別。如果函式不回傳任何值,可以使用 **`void`**。
### 範例程式碼
**範例 1:基本函式型別**
```tsx=
function add(x: number, y: number): number {
return x + y;
}
```
**`add`** 函式有兩個參數 **`x`** 和 **`y`**,它們都是 **`number`** 型別,並且函式回傳一個 **`number`** 型別的值。
## 函式表達式與箭頭函式
在 TypeScript 中,也可以使用 ES6 的箭頭函式(Arrow Function)來簡化函式表達式。
例如,一個箭頭函式的加法函式可以寫成:
```tsx=
const add = (x: number, y: number): number => x + y;
```
## **單選題**
1. TypeScript 中,函式陳述式的主要特點是什麼?
A. 可以被賦值給變數
B. 必須要有函式名稱
C. 都必須要回傳 **`void`**
D. 不可以有回傳值
2. 在 TypeScript 中,函式參數的型別註釋主要作用是什麼?
A. 指定函式執行的時間
B. 定義函式的參數和回傳值的型別
C. 確定函式的名稱
D. 調整函式的性能
4. 以下哪個選項正確定義了一個 TypeScript 函式,該函式接受兩個 **`number`** 類型的參數並回傳一個 **`number`**?
A. **`function add(x, y) { return x + y; }`**
B. **`const add = (x: number, y: number) => x + y;`**
C. **`let add = function(x, y) { return x + y; }`**
D. **`add(x: number, y: number): number { return x + y; }`**
5. 如果一個 TypeScript 函式不回傳任何值,它的回傳型別應該是什麼?
A. **`number`**
B. **`string`**
C. **`void`**
D. **`boolean`**
## **實做題**
1. 設計一個 **`multiply`** 函式陳述式,設計兩個 **`number`** 型別的參數,並回傳它們的乘積。
2. 宣告一個 **`concatStrings`** 變數,並賦值匿名箭頭函式,以符合函式表達式,設計兩個 **`string`** 型別的參數,並將它們連接起來。
3. 設計一個函式 **`isGreaterThanTen`** 函式陳述式,設計一個 **`number`** 型別的參數,並檢查該數字是否大於 10,回傳 **`boolean`** 值。
## **面試題(選作)**
使用函式陳述式、函式表達式的時機點是什麼時候?
## 回報流程
將答案寫在 CodePen,並貼至底下回報就算完成了喔!
解答位置請參考下圖(需打開程式碼的部分觀看)

<!-- 解答:
單選題目:B、B、B、C
開發題目:
let score: number = 80;
let message = "Hello, TypeScript!";
let fullName: string = "洧杰";
題目一:
function multiply(x: number, y: number): number {
return x * y;
}
題目二:
const concatStrings = (str1: string, str2: string): string => {
return str1 + str2;
};
題目三:
function isGreaterThanTen(num: number): boolean {
return num > 10;
}
-->
回報區
---
| Discord | CodePen / 答案 |
|:-------------:|:----------------------------------------------------------------:|
|洧杰|[Codepen](https://codepen.io/hexschool/pen/poYgYqW?editors=1010)|
|神奇海螺(Discord 名)|[Codepen](https://codepen.io/codemachine0121/pen/LYaZqyG)|
|展誠|[Codepen](https://codepen.io/hedgehogkucc/pen/YzgWBYZ?editors=1010)|
|連小艾|[Codepen](https://codepen.io/bolaslien/pen/RwdRvJZ?editors=1000)|
|苡安|[Codepen](https://codepen.io/yi-an-yang/pen/JjzKxvX)|
|YH.Lo|[Codepen](https://codepen.io/chloelo/pen/XWGKOxJ)|
|ZS|[Codepen](https://codepen.io/irishuang/pen/eYXzxKq)|
|HsienLu|[Codepen](https://codepen.io/Hsienlu/pen/yLwJwLB)|
|Derrick|[Codepen](https://codepen.io/Derricktang/pen/XWGKGJd?editors=0010)|
|YC|[HackMD](https://hackmd.io/SKoJd3EsTlitnjzCx4Rarg)|
|77_0411|[Codepen](https://codepen.io/chung-chi/pen/KKEMJYL?editors=1100)|
|亞當|[Codepen](https://codepen.io/Adam-Hsu/pen/ZEPOPEY?editors=1010)|
|m_m|[CodePen](https://codepen.io/minnn7716/pen/bGZeJEE)|
|hiYifang|[HackMD](https://hackmd.io/@gPeowpvtQX2Om6AmD-s3xw/B1VlA0_uT)|
|wendy_.li|[HackMD](https://hackmd.io/PcmFgqZwRd-4Ep3-LgK5_Q?both)|
|ethan1331|[CodePen](https://codepen.io/EthanTsai/pen/mdoEYKB)|
|BEN|[CodePen](https://codepen.io/Kao-Yu-Chun/pen/yLwJWqr)|
|rikku1756|[CodePen](https://codepen.io/rikkubook/pen/Babzgyq?editors=1011)|
|Judy ☻|[Codepen](https://codepen.io/hsiaohan/pen/wvOWbbY?editors=1010)|
|BonnieChan|[Codepen](https://codepen.io/Bonnie-chan-the-bold/pen/KKEMONW?editors=0010)|
|Yee|[Codepen](https://codepen.io/alivealife/pen/dyrXxNr)|
|Otis|[Codepen](https://codepen.io/humming74/pen/XWGKvME?editors=1011)|
|JC|[Codepen](https://codepen.io/jcsamoyed/pen/OJqXKpy?editors=0011)
|Mi|[CodePen](https://codepen.io/Mi-Jou-Hsieh/pen/rNRLbPq?editors=1111)|
|Teddy|[CodePen](https://codepen.io/TaideLi/pen/zYbKOPO)|
|Zuo|[CodePen](https://codepen.io/linchinhsuan/pen/poYEzex?editors=1010)|
|hannahTW|[CodePen](https://codepen.io/hangineer/pen/QWoKLRY?editors=1010)|
|LinaChen|[CodePen](https://codepen.io/LinaChen/pen/VwRKZJz)|
| 銀光菇 | [CodePen](https://codepen.io/genesynthesis/pen/MWxeLzM) |
| jasperlu005 | [Codepen](https://codepen.io/uzzakuyr-the-reactor/pen/ZEPpEwL) |
| Bryan Chu | [CodePen](https://codepen.io/bryanchu10/pen/gOEwOyJ) |
| NiuNiu | [CodePen](https://codepen.io/Dawson-the-bold/pen/RwdGNrm?editors=0010) |
| deedee1215 | [CodePen](https://codepen.io/diddy032/pen/GRejRrX) |
| gail浴池 | [CodePen](https://codepen.io/GailChang/pen/mdoryZP) |
| shaokang | [CodePen](https://codepen.io/tony-hsueh/pen/OJqRVwQ) |
|Henry_Wu | [CodePen](https://codepen.io/hekman1122/pen/YzgGyPE?editors=1010)|
|Mia | [CodePen](https://codepen.io/Mianzi/pen/poYEgNP?editors=1010)|
|時雨|[Codepen](https://codepen.io/jjustin-35/pen/yLwaOLE)|
|Yang|[Codepen](https://codepen.io/Yang-J/pen/jOJMqGv)|
|yunhung|[Codepen](https://codepen.io/ahung888/pen/qBvaRvo)|
|Starr|[CodePen](https://codepen.io/StarrZhong/pen/NWJRjPa)|
|chaya|[CodePen](https://codepen.io/vickyvvv9/pen/NWJRgzQ?editors=1010)|
|erwin阿瀚|[CodePen](https://codepen.io/yohey03518/pen/gOEwGOw)|
|Jack|[CodePen](https://codepen.io/lj787448952/pen/YzgGQVe)|
|puffy|[codepen](https://codepen.io/TernMayDay/pen/rNRMpgZ)|
|wei|[CodePen](https://codepen.io/jweeei/pen/dyrpbyo)|
|薏慈|[CodePen](https://codepen.io/its_wang/pen/WNmGKdq)|
|shan13|[CodePen](https://codepen.io/yishan13-tsai/pen/OJqRaWo)|
|nina.kuo|[codepen](https://codepen.io/ninakuo0814/pen/WNmGXPN)|
|精靈|[CodePen](https://codepen.io/justafairy/pen/XWGNWNm)|
|楓|[CodePen](https://codepen.io/maplestartend/pen/wvOowxp)|
|bonnieli1414|[CodePen](https://codepen.io/bonnieli1414/pen/KKENMdJ?editors=1011)|
|leave3310|[CodePen](https://codepen.io/leave3310-the-looper/pen/JjzbONR?editors=1011)|
|Lisa|[CodePen](https://codepen.io/lisaha/pen/poYNdNB?editors=1111)|
|Trevor Lin|[CodePen](https://codepen.io/0Trevor0/pen/PoLbejr)|
|Tina|[CodePen](https://codepen.io/TinaTing/pen/poYNqvJ?editors=1010)|
|皓皓|[HackMD](https://hackmd.io/@cutecat8110/SyJUywZYp)|
|翰毅|[CodePen](https://codepen.io/yzuigtdw-the-animator/pen/VwRmoax)|
|Yao|[CodePen](https://codepen.io/AlbertoLL/pen/ZEPBgLB)|
|Alyce|[CodePen](https://codepen.io/alycehwy/pen/MWxjMNe)|
|四季春|[CodePen](https://codepen.io/KuoMin/pen/oNVBjOe)|
|Amberhh | [codepen](https://codepen.io/Amberhh/pen/eYXgZxb)|
| 黃士桓 | [codePen](https://codepen.io/shr-huan-huang/pen/NWJdNew) |
|zoe|[Codepen](https://codepen.io/Zoechiueh/pen/NWJdRPV?editors=0011)|
|Alex|[Codepen](https://codepen.io/datsxzqg-the-selector/pen/oNVBwPZ?editors=0010)|
| Rochel |[Codepen](https://codepen.io/rochelwang1205/pen/MWxJqLp?editors=1010)|
| clairechang |[Notion](https://claire-chang.notion.site/Day-3-c652ceb54e5648588f15ee14554c4434)|
| MCBB_4881 |[Codepen](https://codepen.io/ebvaxaah-the-bashful/pen/oNVBrGL?editors=0010)|
| 小米 |[Codepen](https://codepen.io/joanne-wei/pen/oNVZNWb?editors=0012)|
|aki|[code](https://codepen.io/aki168/pen/poYeqao)|
| fanshu0303 | [CodePen](https://codepen.io/JuiHsuanLee0303/pen/bGZqmPq) |
| Yoshi | [CodePen](https://codepen.io/yoshiyyc/pen/xxBrKpY) |
|Snorlax|[HackMD](https://hackmd.io/@snorlaxpock/ryOINV5tT)|
|kevinhes|[CodePen](https://codepen.io/kevinhes/pen/Babdzpo?editors=0011)|
|Nick Lin|[CodePen](https://codepen.io/NickLinP/pen/zYbdPBp?editors=1111)|
| Han | [HACKMD](https://hackmd.io/@laihan/B18o2EaKa) |
| Jay | [CodePen](https://codepen.io/jayredk/pen/mdoBeNJ?editors=0010)
| 大衛 | [CodePen](https://codepen.io/exnsrpjc/pen/oNVpNRP?editors=1011)
| AmberL | [CodePen](https://codepen.io/autum55853/pen/ZEPaMbX)
| Eileen | [CodePen](https://codepen.io/Eileen-io/pen/OJqzKoM)
| 狸貓 | [CodePen](https://codepen.io/tanuki320/pen/wvOjpjb?editors=1010)
| 阿鬥鬥 | [CodePen](https://codepen.io/yvonne217/pen/bGZMPbq)
|Tori|[HackMD](https://hackmd.io/OAdkiOH-S_WkD-LF6IONVA?view)|