對JS閉包的理解

Black_snow_ji發表於2020-02-23

閉包是什麼?

  • 閉包就是能夠讀取其他函式內部變數的函式。在JavaScript中
    只有函式內部的子函式才能讀取區域性變數,所以閉包可以理解
    成為“定義在一個函式內部的函式”。

瞭解閉包

  • 閉包的生成有三個必要條件(缺一不可)
    1. 在函式 A 內部直接或者間接返回一個函式 B
    2. B 函式內部使用著 A 函式的私有變數(私有資料)
    3. A 函式外部有一個變數接受著函式 B
  • 閉包完成會形成了一個不會銷燬的函式空間

閉包空間

  • 我們管這個不會銷燬的 A 函式的執行空間叫做 閉包空間
  • 把函式 A 裡面返回的 函式 B, 叫做函式A 的 閉包函式
  • 官方給的定義有一句話: 閉包 => 函式內部的函式

閉包的優缺點 (優點與缺點並存)

–. 閉包的優點:

  1. 保護函式內的變數安全
  2. 在記憶體中維持一個變數(用的太多就變成缺點,佔記憶體)
  3. 邏輯連續,當閉包作為另一個函式呼叫的引數時,避免你脫離當前邏輯而重新編寫額外邏輯
  4. 方便呼叫上下文的區域性變數
  5. 加強封裝性,可以達到對變數的保護作用
  6. 可以避免全域性汙染

–. 閉包缺點:

  1. 常駐記憶體,會增大記憶體使用量,使用不當很容易造成記憶體洩漏
  2. 執行空間不會銷燬,會造成記憶體浪費
  3. 對閉包的使用不當會造成無效記憶體的產生
閉包優缺點的總結
  1. 延長了變數的生命週期
    • 優點: 因為執行空間不銷燬, 變數也沒有銷燬
    • 缺點: 因為執行空間不銷燬, 會一直存在在記憶體中
  2. 可以訪問函式內部的私有變數
    • 優點: 利用閉包函式可以訪問函式內部的私有變數
    • 缺點: 執行空間不會銷燬, 會一直存在在記憶體中
  3. 保護私有變數(只要是函式, 就有這個特點)
    • 優點: 保護私有變數不被外界訪問
    • 缺點: 如果向訪問, 必須要利用閉包函式
閉包的函式的【致命】缺點
  • 因為當一段記憶體空間中有一個不會被銷燬的東西一直存在
    那麼就會出現記憶體佔用, 如果過多, 就會導致記憶體溢位
    那麼結果就是 記憶體洩漏
閉包的作用
  • 就是當你需要延長變數的宣告週期的時候
    或者你需要訪問某一個函式內部的私有資料的時候
    你可以使用 閉包 函式來解決

  • 注意:
    如果有別的方法, 儘量不要使用閉包函式
    只有到沒有招的時候, 我們在使用閉包函式
    閉包: 慎用


用程式碼來說明閉包的用法

function a() {
   這個 num 變數就是函式 a 的私有變數
  var num = 10

  return function b() {
    console.log(num)
  }
}

var res = a()

 // res 接受的是 a 函式執行以後的返回值
 //res 接受的就是函式 a 內部返回的一個複雜資料型別(函式b)
 //導致函式 a 的執行空間不會銷燬

//從現在開始, res 隨時可以是一個 函式a 裡面返回的 函式b
// res 隨時可以呼叫
res()
 當 res 呼叫的時候, 列印 num
 列印出來的就是 a 函式內部的私有變數 num 的值

–> 程式碼的特點:
1.函式 b 巢狀在函式 a 內部
2.函式 a 返回 函式 b

相關文章