對JS閉包的理解
閉包是什麼?
- 閉包就是能夠讀取其他函式內部變數的函式。在JavaScript中
只有函式內部的子函式才能讀取區域性變數,所以閉包可以理解
成為“定義在一個函式內部的函式”。
瞭解閉包
- 閉包的生成有三個必要條件(缺一不可)
1. 在函式 A 內部直接或者間接返回一個函式 B
2. B 函式內部使用著 A 函式的私有變數(私有資料)
3. A 函式外部有一個變數接受著函式 B - 閉包完成會形成了一個不會銷燬的函式空間
閉包空間
- 我們管這個不會銷燬的 A 函式的執行空間叫做 閉包空間
- 把函式 A 裡面返回的 函式 B, 叫做函式A 的 閉包函式
- 官方給的定義有一句話: 閉包 => 函式內部的函式
閉包的優缺點 (優點與缺點並存)
–. 閉包的優點:
- 保護函式內的變數安全
- 在記憶體中維持一個變數(用的太多就變成缺點,佔記憶體)
- 邏輯連續,當閉包作為另一個函式呼叫的引數時,避免你脫離當前邏輯而重新編寫額外邏輯
- 方便呼叫上下文的區域性變數
- 加強封裝性,可以達到對變數的保護作用
- 可以避免全域性汙染
–. 閉包缺點:
- 常駐記憶體,會增大記憶體使用量,使用不當很容易造成記憶體洩漏
- 執行空間不會銷燬,會造成記憶體浪費
- 對閉包的使用不當會造成無效記憶體的產生
閉包優缺點的總結
- 延長了變數的生命週期
- 優點: 因為執行空間不銷燬, 變數也沒有銷燬
- 缺點: 因為執行空間不銷燬, 會一直存在在記憶體中
- 可以訪問函式內部的私有變數
- 優點: 利用閉包函式可以訪問函式內部的私有變數
- 缺點: 執行空間不會銷燬, 會一直存在在記憶體中
- 保護私有變數(只要是函式, 就有這個特點)
- 優點: 保護私有變數不被外界訪問
- 缺點: 如果向訪問, 必須要利用閉包函式
閉包的函式的【致命】缺點
- 因為當一段記憶體空間中有一個不會被銷燬的東西一直存在
那麼就會出現記憶體佔用, 如果過多, 就會導致記憶體溢位
那麼結果就是 記憶體洩漏
閉包的作用
-
就是當你需要延長變數的宣告週期的時候
或者你需要訪問某一個函式內部的私有資料的時候
你可以使用 閉包 函式來解決 -
注意:
如果有別的方法, 儘量不要使用閉包函式
只有到沒有招的時候, 我們在使用閉包函式
閉包: 慎用
用程式碼來說明閉包的用法
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
相關文章
- js閉包的理解JS
- 談談我對js中閉包的理解JS
- 對javascript閉包的理解JavaScript
- [譯]理解JS中的閉包JS
- JS-閉包(closure)的理解JS
- 面試:對javascript的閉包的理解面試JavaScript
- 深入理解JS閉包JS
- 徹底理解js中的閉包JS
- 理解“閉包”
- 理解閉包
- PHP 閉包的理解PHP
- 理解Javascript的閉包JavaScript
- java程式設計師理解js中的閉包Java程式設計師JS
- 理解JavaScript 閉包JavaScript
- Groovy閉包理解
- 理解 JavaScript 閉包JavaScript
- javascript閉包的個人理解JavaScript
- Golang中閉包的理解Golang
- 理解 JavaScript 中的閉包JavaScript
- js中的閉包JS
- 深入理解閉包
- 深入理解swift的閉包Swift
- 理解C#中的閉包C#
- 【譯】理解Rust中的閉包Rust
- 深入理解javascript原型和閉包(15)——閉包JavaScript原型
- js閉包及閉包的經典使用場景JS
- JS閉包ClosureJS
- js--閉包JS
- js-閉包JS
- JS中的 閉包(Closure)JS
- 從這兩道題重新理解,JS的this、作用域、閉包、物件JS物件
- JS學習理解之閉包和高階函式JS函式
- 閉包的理解-from my own opinion
- javascript閉包的理解和例項JavaScript
- 面試題:如何理解閉包面試題
- 全面理解Javascript閉包和閉包的幾種寫法及用途JavaScript
- 【JS基礎】從零開始帶你理解JavaScript閉包--我是如何徹底搞明白閉包的JSJavaScript
- 用“揹包”去理解Go語言中的閉包Go