深入理解js閉包(快速理解)

2021-10-03 08:13:18 字數 2037 閱讀 9954

一、閉包的基本概念

閉包是函式的一種高階應用方式

通過建立乙個不被銷毀的儲存空間,來在函式的外部呼叫和使用函式內部的資料

二、如何定義乙個不被銷毀的執行空間

預設情況下,函式執行完畢,函式執行空間中的程式,也會被銷毀

定義不被銷毀的執行空間的方法

1,在函式內部,返回乙個引用資料型別 (陣列,物件,函式)

2,在函式的外部,有變數來引用這個函式

3,此時函式的執行空間就不會被銷毀

function

fun();

// 函式的返回值是乙個引用資料型別---物件

return obj;

}// 在函式外部有乙個變數,來引用這個函式

// 此時 變數 a中,儲存的就是返回值obj這個物件

// 此時 函式fun的執行空間就不會被銷毀

let a =

fun();

console.

log(a)

;

// 在函式外部有乙個變數,來引用這個函式

// 此時 變數 a中,儲存的就是返回值obj這個物件

// 此時 函式fun的執行空間就不會被銷毀

let a = fun();

console.log(a);`

執行過程

1,在函式中開闢乙個執行空間 來執行函式程式

2,在這個執行空間中,定義 物件 obj

3,函式的返回值是 obj

4,返回的是obj這個物件的記憶體位址

5,變數a 引用函式, a中儲存的是obj的記憶體位址

6,呼叫使用a , 是通過 a中 儲存的記憶體位址 , 來找到obj的儲存空間,並且呼叫其中的資料

總結:如果返回值是 基本資料型別, 儲存的資料已經作為返回值

基本資料型別變數是否繼續存在,不會影響返回值

如果返回值是 引用資料型別, 返回的是儲存位址

如果 引用資料型別被銷毀, 根據儲存位址是無法找到對應的儲存資料的

三、定義閉包

通過上述解析可以得出,定義閉包可以簡要分為以下幾步:

1,定義乙個函式a,返回值是乙個函式b

2,在返回值函式b中,使用函式a定義的區域性作用域變數

3,在函式a的外部,引用函式a,並且執行返回值函式b

function

funa()

;// 返回值是 abc 也就是,函式a中的區域性作用域變數

return abc;}}

// 在函式a外部,呼叫引用函式a

// 此時變數a1 中, 儲存的是 函式b 的 記憶體位址

let a1 =

funa()

;// 呼叫a1,實際就是通過a1中儲存的函式b的記憶體位址,來呼叫函式b

// 此時a2儲存的應該是函式b的返回值 abc 也就是 函式a中的區域性作用域變數

let a2 =a1(

);// 最終的目的就是通過函式b的返回值,來在函式a的外部,來呼叫使用函式a的區域性作用域變數

but 閉包現在使用的情況很少了,這與它的安全性有關

四、閉包的特點

既是優點,也是缺點

1,函式作用域空間不會被銷毀

優點是:空間中的內容,永遠存在

缺點是:占用大量的記憶體空間

2,可以從外部訪問函式內部的變數

優點是:使用變數資料方便

缺點是:容易洩露資料資訊

3,保護私有作用域變數

優點是:確保私有作用域變數一直存在

缺點是:占用記憶體空間

閉包的最大問題是:有可能造成占用大量的記憶體空間,降低程式的執行效率,甚至有可能造成資料溢位或者是資料洩露

因為為了保護資料的安全性,特殊情況下,才會使用閉包

深入理解JS閉包

閉包 closure 是j acript語言的乙個難點,也是它的特色,很多高階應用都要依靠閉包實現。一 變數的作用域 要理解閉包,首先必須理解j ascript特殊的變數作用域。變數的作用域無非就是兩種 全域性變數和區域性變數。j ascript語言的特殊之處,就在於函式內部可以直接讀取全域性變數。...

深入理解閉包

閉包的定義 mdn 對閉包的定義 根據上面的例子,舉乙個例子 var str xiaoqi function getname getname 函式可以返回str這個變數,但str即不是getname函式的區域性變數,也不是foo函式的引數,所以str就是自由變數。這樣函式getname就是乙個閉包。...

js之深入理解閉包問題。

最近一段時間準備好好學習下機器學習,所以了解了很多機器學習方面的知識。抓緊補救了下自己曾經遺忘的理論知識 高數 統計學 概率論 微積分等 發現還有點吃力了,很多東西都快忘得差不多。不過,咱程式設計師,還是很擅長圍魏救趙滴 所以,我果斷的選擇邊理論邊著手老本行 程式設計。選擇語言問題,就是第一大難題。...