一、閉包的基本概念
閉包是函式的一種高階應用方式
通過建立乙個不被銷毀的儲存空間,來在函式的外部呼叫和使用函式內部的資料
二、如何定義乙個不被銷毀的執行空間
預設情況下,函式執行完畢,函式執行空間中的程式,也會被銷毀
定義不被銷毀的執行空間的方法
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之深入理解閉包問題。
最近一段時間準備好好學習下機器學習,所以了解了很多機器學習方面的知識。抓緊補救了下自己曾經遺忘的理論知識 高數 統計學 概率論 微積分等 發現還有點吃力了,很多東西都快忘得差不多。不過,咱程式設計師,還是很擅長圍魏救趙滴 所以,我果斷的選擇邊理論邊著手老本行 程式設計。選擇語言問題,就是第一大難題。...