# 第四週課程重點筆記
###### tags: `JS 課程重點筆記` `2021` `JS直播班` `秋季班` `六角學院`
## :mag_right: 函式的功能
:robot_face: 設定函式就如同設定指令,類似於教機器人做事的步驟。
:robot_face: 由於函式可以重複被呼叫的特性,當有需要被**重複使用**的步驟,就能考慮將程式碼包裝成函式。
```
差異比較:
函式可多次呼叫、重複執行,但 if 判斷式只會執行一次。
```
## :mag_right: HOW TO 宣告、呼叫函式
```
前情提要:
宣告函式概念類似於宣告變數 (函式與變數都屬於陳述式),
宣告之後必須再度透過呼叫函式,它才會執行大括號內的指令,
反之就只會暫時存在記憶體中。
let a = 1;
console.log(a);
```
```javascript=
// 宣告 2 個函式
function morningAction(){
console.log('起床');
console.log('刷牙');
console.log('洗臉');
console.log('吃早餐');
console.log('出門');
}
function eveningAction(){
console.log('返家');
console.log('吃晚餐');
console.log('刷牙');
console.log('洗臉');
console.log('睡覺');
}
// 呼叫函式
morningAction();
eveningAction();
// 註:函式的小括號用來代入參數
```
## :mag_right: 函式與參數的關係:input & output
### 流程:輸入 :arrow_right: 編譯 :arrow_right: 輸出
```javascript=
function addNumber(a,b,c){
console.log(a+b+c);
}
addNumber(6,6,6);
//回傳 18
//輸入:參數(6,6,6)
//編譯:function
//輸出:console.log
```
## :brain: 函式的設計思考方法
:::success
:bulb: **以數字相減器為例:**
1. 先列出核心公式,即先找出一個算式確保「功能」的運作。
2. **SOP**:輸入(參數)、(function)編譯、輸出
:::
####
```javascript=
//STEP1 先寫出功能
//向函式許願:我想要一個有相減功能的酷東東
let a = 7;
let b = 2;
console.log(`a跟b相減的結果為${a-b}`);
//STEP2 找出變因
//變因即是參數,在範例中,變數 a 跟變數 b 就是變因
//STEP3 構思函式
//有了參數就可以製作函式
function minusNumber(a, b){
console.log(`a跟b相減的結果為${a-b}`);
}
minusNumber(3, 3);
//回傳 0
```
## :mag_right: 函式與變數
* let 跟 const 宣告的變數,作用域只限區塊作用域
```javascript=
let a = 4;
function num(){
let a = 3;
}
num();
console.log(a);
// 回傳 a 是 4
```
* 重新賦值:會先從內找,函式內找不到對應的變數,再往外找
```javascript=
let c = 8;
function addNum(a, b){
c = 9;
console.log(c);
// 回傳 c 為 9
}
addNum(4, 4);
console.log(c);
// 回傳 c 為 9;
```
* 函式內宣告過的變數,接受在函式內重新賦予值
```javascript=
let c = 3;
function addNum(a, b){
let c = 4;
c = 8;
console.log(c);
// 回傳 c 為 8
}
addNum(2,2);
console.log(c);
// 回傳 c 為 3
```
## :dart: 試題練習:函式的 input & output 執行資料處理
### :one: 函式處理字串
```javascript=
function talk(message){
console.log('hi,' + message)
}
//input
talk("早上好");
talk("晚上好");
// output
// "hi,早上好"
// "hi,晚上好"
```
### :two: 函式幫外部變數累加數字
```javascript=
let data = 0;
function count(num){
data+=num;
console.log(data)
}
//input
count(2);
count(3);
count(5);
//output
2
5
10
```
### :three: 函式取小數點後二位數
```javascript=
function twoFixed(num){
console.log(num.toFixed(2));
}
twoFixed(1.8888)
twoFixed(3.1234)
// output
// 1.89
// 3.12
```
### :four: 函式將字串儲存到陣列中
```javascript=
let data = []
function add(str){
console.log(data)
}
add("hello");
add("hello,你好嗎?");
//output
// ["hello"]
// ["hello,你好嗎?"]
// 這一題是字串資料直接推到陣列中
```
### :five: 函式將物件儲存到陣列中
```javascript=
let data = [];
function add(data1, data2){
let obj = {};
obj.name = data1;
obj.sex = data2;
data.push(obj);
console.log(data)
}
add("洧杰","男生");
add("葉子","女生");
// output
//[
// {name:"洧杰",sex:"男生"},
// {name:"葉子",sex:"女生"}
//]
// 這一題是物件推到陣列中
```
### :six: 函式從物件取值,再組出字串
```javascript==
const bmiStatesData = {
"overThin": {
"state": "過輕",
"color": "藍色"
},
"normal": {
"state": "正常",
"color": "紅色"
}
}
function checkBmiStates(str){
console.log(`
你的體重${bmiStatesData[str].state},
指數為${bmiStatesData[str].color}`)
}
checkBmiStates("overThin"); //你的體重過輕,指數為藍色
checkBmiStates("normal"); //你的體重正常,指數為紅色
```
## :mag_right: 函式回傳值:return
函式內計算完後的結果,只會儲存在函式之內。
除非透過 **return** 回傳出去
```javascript=
function power(num){
console.log(num*num); //印出 25
}
let numNum = power(5);
console.log(numNum); //印出 undefined
```
### :arrow_heading_down: 若計算結果要傳送到指定位置,就用 return 傳到 function 外部。
```javascript=
function power(num){
return num*num // 25
}
let cacuNumber = power(5); //把函式運算結果存在變數才能 return 到 function 外
console.log(cacuNumber); //印出 25
```
### :arrow_heading_down: let 宣告的變數作用域在區塊作用域內,也要用 return 傳到 function 外部。
```javascript=
function addNum(a, b){
let totalNum = a + b;
return totalNum
}
const sum = addNum(5, 3);//把函式運算結果存在變數才能 return 到 function 外
console.log(sum) // 8
```
### :warning: return 結果後,函式就中止跳出
```javascript=
function power(num){
console.log(4)
if(num > 5){
console.log('2')
return 1
}else{
return 0
}
}
let numNum = power(5);
console.log(numNum);
```
## :mag_right: funtion & method 的差異
```javascript=
// function 寫法
funtion sayHelloInEnglish(){
console.log('Hello!')
}
// 呼叫 function
sayHelloInEnglish();
// method 寫法 (function 包在物件裡)
let sayHello = {
inEnglish: function(){
console.log('Hello!')
},
inChinese: function(){
console.log('你好')
},
inFrench: function(){
console.log('Bonjour!')
}
}
// 呼叫 function
sayHello.inFrench();
// 綁定監聽事件
const english = document.querySelector('.english')
const chinese = document.querySelector('.chinese')
const french = document.querySelector('.french')
// method in addEventListener
english.addEventListener('click', sayHello.inEnglish)
// 箭頭函示
chinese.addEventListener('click', ()=>sayHello.inChinese())
// function in addEventListener
french.addEventListener('click', function(){
sayHello.inFrench()
})
```
## :mag_right: funtion expression
```javascript=
const greeting = function(name){
console.log(`Hello, ${name}!`);
}
greeting('visitors');
```
## :mag_right: arrow function
```javascript=
// 1
const greeting = (name) => {
console.log(`Hello, ${name}!`);
}
// 2 ( ) 可簡化, 前提是參數只有一個
const greeting = name => {
console.log(`Hello, ${name}!`);
}
greeting('visitors');
// 3
const greeting = (time, name) => {
console.log(`Good ${time}, ${name}!`);
}
greeting('night', 'visitors');
```