---
# System prepended metadata

title: 第五週共筆筆記 - <br> 11/2 核心篇第五堂：函式
tags: [2022JS直播班, 核心篇, 六角學院]

---

# 第五週共筆筆記 - <br> 11/2 核心篇第五堂：函式
###### tags: `核心篇`、`六角學院`、`2022JS直播班`
[講義連結](https://hackmd.io/iQF41M3DR3qEesvPcMIzzg)
## 共筆簽到區


## 正課開始！~~~~

### 本日知識點


#### 函式本身由 function定義
---
     1 可以執行片段程式碼
     2 可以重複的呼叫
     3. 可以傳入不同的參數，
```javascript!
function callSomesone(somesone){
    console.log(`嘿，那個誰${someone} 來一下`);
}
callSomeone('小明');

//函式也是一個物件

callSomeone.myName = '這是函式';
console.log.dir(callSomeone);

```

>定義函式  要小寫開頭

4. 限制作用域

```javascript!
function callSomesone(somesone){
    const who = '漂亮阿姨'
    console.log(`嘿，那個誰${someone} 來一下`);
}
callSomeone('小明');

//函式也是一個物件

callSomeone.myName = '這是函式';
console.log.dir(callSomeone);

```
![](https://i.imgur.com/XVYjrT8.png)

5. 函式可以回傳值
```javascript!
function callSomeone(someone) {
      const who = '漂亮阿姨'
      return 黑，我是 ${who}，那個 ${someone} 來一下
}
const text = callSomeone('小明')
console.log(text + '這是其他的字串');
```

案例：需要一個函式，他可以相乘
 1. 先將可以運作的程式碼寫出來
```js!
let num = 2;
let num2 = 4;
let result = num * num2;
console.log(result);
```
2. 將運算的部份抽離
```js!
let num = 2;
let num2 = 4;
let result;

function multiplay(params) {
result = num * num2; 
}
multiplay();
console.log(result);
```
3. 參數及 return
```js!
let num = 2;
let num2 = 4;
let result;
function multiplay(a, b) {
result = a * b; 
}
let result = multiplay(num, num2);

console.log(result);
```

函式陳述式 一定要有名字

### 一級函式
一個特性、一個概念
1. 函式可以作為變數(函式表達式)
![](https://i.imgur.com/XMHiqVU.png)



#### Callback Function
傳來傳去會一直改名字，先專注看函式本身

2.函式可以做為參數使用
```javascript!
cnost fn = function(callbackFunction){
    callbackFunction()
}
fn(function({
    console.log(123);
}))
```
```javascript!
function fn(callbackFumction){
    var a = "小名";
    var b = "杰倫";
    callbackFunction(a,b)  //需要使用 fn 函式先做一次使用
}
fn(function(x,y) {
    console.log(`${x}, ${y} 是好朋友`);
})
```

### forEach 的Callback function 寫法

```javascript!
fn(["小明", "杰倫", "漂亮阿姨"], (item, i) {
   console.log(item, i);
   })
// 待補
   
   
```

![](https://i.imgur.com/hxWTjvy.png)
![](https://i.imgur.com/sanbEqG.png)


3. 函式可以作為回傳值
```javascript!
function fn(){
    return funciton() {
        console.log("這是回傳的函式");
    };
}
fn()();

```
![](https://i.imgur.com/OmwDce6.png)


### 高階函式
一個技法：有一級函式的特性就有高階函式的寫法！
如果沒有高階函式，函式執行方式會被限制
1. 函式作為參數傳入 （如果JS沒有高階函式的技法時可以這樣寫）
```javascript!

```
![](https://i.imgur.com/bDiiU2I.png)

2. 輸出一個函式
```javascript!
function discountTool(price, value) {
    return price * value;
}
const breadPrice = discountTool(100, 0.8);
console.log(breadPrice);
// output: 80

const cookiePrice = discountTool(80, 0.7);
console.log(cookiePrice);
// output: 56

```
![](https://i.imgur.com/VDhlc4t.png)

### 高階函式技巧
1. 傳入的是價格
```javascript!
function discountTool(price) {
    const originPrice = price;
    return function (value) {
        return originPrice * value;
    }
}

const breadPrice = discountTool(100);
console.log(breadPrice); // 會印出一個函式
console.log(breadPrice(0.8));
console.log(breadPrice(0.7));


```
#### 1. 閉包：closure （一種高階函式的技法）
內層函式可以取得外層函式作用域內的變數

如何形成？
特性？

閉包就是內層函，是可以取得外層函式作用域內的變數

```javascript=
function fn(){
var someVariable = 100;

}
```
![](https://i.imgur.com/j804x5P.png)

#### 2. 透過高階函式特性(回傳函式)，將作用域內的變數儲存不被釋放
```javascript!
function sellBread(){
    //這裡宣告的變數，外部存取不到
    const breadPrice = 100;
    let count = 0;
    return function(c){
        //到底賣了多少，外層也存取不到
        count +=c;
        console.log(`今天賣出了${count} 麵包，總共賺了 ${breadPrice * count} 元`);
    }
}
const todayTotal = sellBread();
cnosole.log(todayTotal);
todayTotal(1);
todayTotal(10);
todayTotal(10);
```
![](https://i.imgur.com/DegUWZN.png)
![](https://i.imgur.com/dRDNm7E.png)
![](https://i.imgur.com/gEQ8agA.png)

#### 3. 私有方法
錢錢，可以存錢、可以花錢、可以取得有多錢的值
```javascript!
function storeMoney (initValue) {
    let money = initValue;
    return {
        increase: function(price) {
            money += price;
        },
        decrease: function(price) {
            money -= price;
        },
        getValue: function(price) {
            return money;
        }
    }
}

const 卡斯伯錢包 = storeMoney(1000); 
console.log(卡斯伯錢包); //物件
卡斯伯錢包.increase(1000);
卡斯伯錢包.decrease(500);
console.log(卡斯伯錢包.getValue());

const rayWallet = sotreMoney(50000);
rayWallet.increase(30000);
rayWallet.decrease(20000);
console.log(rayWallet.getValue());

```
![](https://i.imgur.com/wfFZdYT.png)
