---
# System prepended metadata

title: 介紹 JavaScript 閉包
tags: [前端筆記]

---

# 介紹 JavaScript 閉包

>引用來源：[另一種方式介紹 JavaScript 閉包](https://ithelp.ithome.com.tw/articles/10191515)

運作原理：就是呼叫函式內的函式。
將函式賦予在另一個變數(balance)上，指向外層函式 使其可以不斷的反覆呼叫，且內層記憶體不會被釋放。
此變數(balance)每次被呼叫時，只會執行內層函式，在內層記憶體沒有被釋放的情況下，myMoney變數會不斷被更新。

### 引用來源範例：剩餘的金額計算
```javascript=
function buyItem() {
  var myMoney = 1000;
  return function (price) {    // 這個閉包目前會被重複呼叫
    myMoney = myMoney - price;
    // myMoney 第一次由外部傳入，接下來在這個 function 內不斷更新
    return myMoney;
  }
}
var balance = buyItem(); // 存取內部函式的變數
balance(100); // 900
balance(100); // 800
balance(100); // 700
// 每次執行都是跑內層的函式，因此也只更新內層的函式變數
```

### 範例
```javascript=
// 會員點數累積，會員商品打8折後，1元換1點，累計點數
function haveDiscount() {
  let bonusPoints = 200; // 最初會員點數
  return function (itemPrice) {
    bonusPoints += itemPrice * 0.8;
    return bonusPoints;
  }
}
let discountPrice = haveDiscount();
discountPrice(200); // 360
```