閉包其實就是函式對上級作用域中變數的捕獲,函式在,閉包在,函式沒人引用了,閉包也就隨之被銷毀。
function test() ;
settimeout(getdata, 10000);
}
一般來說,在函式內建立的區域性變數,在函式執行結束後,是會被自動銷毀的. 例子中每執行一次 test 函式,就會建立一次 data 資料,如果 getdata 沒有引用上層作用域的 data 變數,data 在 test 函式執行結束後,便會被銷毀。getdata 在建立的時候,就會隨之建立乙個特殊的容器,用於儲存上層作用域中變數的引用。可以這麼說,getdata 函式建立的閉包捕獲了外部的 data 變數的引用。按理說,getdata 這個變數在 test 函式執行結束後,也是會被銷毀的。事實也的確如此,如果沒有後面的 settimeout 的話。正因為 settimeout 一直拿著 getdata 這個函式的引用,而 getdata 形成的閉包又捕獲了 data 變數的引用,因此 data 資料會一直存在,並不會在 test 函式結束之後立馬銷毀。settimeout 在 10s 之後會執行 getdata 指向的函式,然後會釋放掉函式引用,也就是說 10s 後沒有變數再引用 getdata 指向的函式了,那麼 getdata 形成的閉包也可以得到銷毀,捕獲的上層變數也一併得到了釋放。所以例子中,getdata形成的閉包是在 10s 後被銷毀的。
那為什麼會有記憶體洩漏呢?
試想如果例子中你使用的不是 settimeout 而是 setinterval, 那麼,getdata 這個函式一直在 setinterval 中被引用著,getdata 形成的閉包以及閉包所捕獲的變數都會一直存在,直到你 clearinterval。如果你忘記 clear 了,或者你 錯誤地起了多個定時器但是並不知道只 clear 了最後乙個,那就產生了記憶體洩漏。
總之,只要沒人再儲存這個函式的引用了,這個函式和函式所形成的閉包也就會被一併銷毀。
出處:
閉包 Python中的閉包
通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...
閉包 解決閉包問題
1 函式和對其周圍狀態 lexical environment,詞法環境 的引用 在一起構成閉包 closure 2 函式與函式所依賴的上下文環境組成閉包問題。3 閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數。var arr ...
python 閉包 python 閉包
閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...