# JS 函式
:bulb: 函式被發明,用以簡化程式中重複的相同/相似的片段
## 函式內的溝通方式
- 呼叫端傳遞參數給被呼叫端
- 被呼叫端
- 收到參數並運算
- `return`關鍵字會<font color="tomato">停止</font>函式,回傳值給呼叫端
```javascript=!
// 定義名為plus的函式(function)),包含名為num1和num2的參數(Parameter)
function plus(num1, num2) {
return num1 * num2;
}
// 呼叫plus函式(執行)
plus(2, 6);
```
---
## 參數-預設值
:bulb:當該參數為`null`或`undefined`,則使用預設值
```javascript=!
// 預設值為Guest
function welcome(temp = 'Guest') {
console.log('Welcome', temp);
}
welcome('Jonny'); // => Welcome Jonny
welcome(); // => Welcome Guest
```
## 參數-不定量(Varargs)
:bulb:`...`作為前綴,並置於所有參數之後
```javascript=!
function sum(num1, num2, ...restOfNum) {
let result = 0;
for (let temp of restOfNum) {
result += temp;
}
return result;
}
console.log(sum(1, 10, 100, 1000));
```
---
## 選項物件(Option object)
:accept:運用 `||`運算子的短路求值,設定預設值
```javascript=!
function record(temp1) {
const temp2 = {
user: temp1.user || 'guest',
age: temp1.gender || '---'
}
console.log(temp2);
}
record({}); // => { user: 'guest', age: '---' }
record({
user: 'Jonny' // => { user: 'Jonny', age: '---' }
});
```
---
## 函式特性
:accept:作為參數被傳遞,稱作回呼函式(Callback function)
:bulb:作為參數被傳遞時,寫回呼函式名稱即可,不須再加`()`
```javascript=
/**
* 迭代tempArr,讓每個tempElement都執行一次tempCalc函式
* @param tempArr 要被迭代的陣列
* @param tempCalc 要執行的函式
*/
function merge(tempArr, tempCalc) {
for(let tempElement of tempArr) {
tempCalc(tempElement);
}
}
// 宣告名為arr的陣列
const arr = [1, 2, 3, 4, 5];
// 定義名為callbackCalc的函式
function callbackCalc(n) {
console.log(n * n);
}
// 呼叫merge函式(執行)
merge(arr, callbackCalc);
```
### 簡寫-匿名函式(接續上述案例)
:accept:省去`函式名`
```javascript=13
// 呼叫merge函式(執行)
merge(arr, function (n) {
console.log(n * n);
});
```
### 簡寫-箭頭函式(接續上述案例)
:accept:省去關鍵字`function`
```javascript=13
merge(arr, (n) => {
console.log(n * n);
});
```
### 簡寫-省略圓括號(接續上述案例)
:accept:用於只有1個參數時
:exclamation:當沒有參數時,需保留空的`()`
```javascript=13
merge(arr, n => {
console.log(n * n);
});
```
### 簡寫-省略大括號、關鍵字return、;(接續上述案例)
:accept:用於函式內只有1行程式時
```javascript=13
merge(arr, n => console.log(n * n));
```
### <font color="tomato">I</font>mmediately <font color="tomato">I</font>nvoked <font color="tomato">F</font>unctions <font color="tomato">E</font>xpression(接續上述案例)
:accept:先將整個函式用`()`包起來,其後再將想傳遞的參數用`()`包起來,表示立刻呼叫函式
###### tags: `frontend` `jsnote` [:arrow_right: Back to Front End Homepage :arrow_left:](/S-c0eqQmS16D8tcTx4ae1g)