> For the complete documentation index, see [llms.txt](https://jack1in.gitbook.io/font-end/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jack1in.gitbook.io/font-end/2.-javascript/2.3-closure.md).

# 2.3 closure

**閉包 (Closure) 是一種特殊的函式，他能夠存取被宣告當下的環境中的變數。**

```
function makeFunc() {
  let name = "John"
  displayName() {
    console.log(name)
  }
  return displayName
}

let func1 = makeFunc()
func1()
```

答案是`"John"`

為什麼呢？

明明`makeFunc()`已經結束執行並回傳了，`name`卻沒有跟著消失呢？

原因跟以下特性有關

**在JavaScript中，即使在外層區塊已經回傳的狀況下，只要內層區塊還保留著一份參考，那麽外層的變數不會隨著回傳而消失，我們依然可以存取外層的變數。**

**當你看到一個 function 內 return 了另一個 function，通常就是有用到閉包的概念**。

**閉包的用意在於 ：避免增加全域變數，但又能取得區域變數的值。**

範例：

```
function buy() {
  let wallet = 1000;
  const displayMoney = (price) =>{
    return wallet -= price;
  }
  return displayName
}

let B = buy()
console.log(B(100)) // 900
console.log(B(100)) // 800
console.log(B(100)) // 700
console.log(B(100)) // 600
```
