對於閉包我的理解

2021-08-22 13:13:09 字數 994 閱讀 7208

閉包這個概念以前看過幾次,不是很理解,今天在菜鳥上又看了一遍,覺得自己好像理解了。在此記下。

其實,我覺得可以把閉包理解為為了解決計數器問題的乙個方法吧。

什麼是計數器問題呢?就是說,我要建立乙個計數器函式,這個函式每執行一次,計數器就加1。

聽起來很簡單。於是就有人開始寫函式。寫函式為了儲存你執行函式的次數,自然要建立乙個變數。

那麼,建立乙個什麼變數呢?

兩種選擇,要麼全域性變數,要麼區域性變數。

假如我建立乙個全域性變數,那麼函式很好寫,噼里啪啦寫完後,發現,咦,雖然我這個函式功能執行沒問題,但是這個全域性變數很容易被別人串改啊。有時候自己可能在下面寫著寫著就忘了自己曾經建立過這個變數,然後一不小心就把這個變數改了,計數器就失常了。

這樣一來,就考慮用區域性變數。但區域性變數也不行。區域性變數是定義在函式內部的。你每呼叫一次函式,變數就會重新定義一次,重新賦值一次。結果就是,你每次呼叫這個函式,得到的結果都是一樣的。這樣的計數器函式根本沒有作用。

這兩種變數都不行。於是就有了閉包,能夠讓函式擁有乙個私有變數。

私有變數是什麼意思呢?就是說,我這個變數,是這個函式獨有的,別的任何函式都改不了它。

但是這個說法不精確。因為區域性變數也是這樣的,區域性變數也是只有本函式才能訪問,外部訪問不了。

私有變數與區域性變數的區別就在於,它們的生命週期不同。區域性變數,在函式執行結束後,變數就被銷毀了,只有等到下次函式重新執行的時候,變數才會再次被建立(似乎這麼說不是很精確,原諒我只是菜鳥)。所以區域性變數起不到「記憶」的功能。但私有變數的生命週期是長的。即使函式結束,私有變數依然能「記住」剛才存了些什麼在裡面。

這就完美解決了上面的「計數器問題」。

簡而言之,「閉包」能夠建立「私有變數」,是為了解決全域性變數與私有變數的侷限性而提出來的一種解決方案。

對於閉包我是這樣理解的

一句話 能夠讀取其他函式內部變數的函式 function fn var bar fn bar web 這是乙個最簡單的閉包,為什麼bar方法輸出的是web,很簡單的一點就是,bar方法與fn方法一直連線在一起,也就是這樣 預編譯作用域和作用域鏈 閉包有點佔記憶體,利用立即執行函式,用完消除 var ...

對於Python閉包的理解

首先看乙個面試中非常常見的題目 def num return lambda x x i for i in range 4 print n 2 for n in num 先看一下num函式的作用,定義了乙個匿名函式,返回傳入引數乘以列表生成式的每乙個元素,所以乍一看結果應該為 0,2,4,6 如果這樣...

swift閉包,我的理解

什麼是閉包?可以捕獲和儲存其所在上下文中任意常量和變數的引用的表示式 我把所有的函式都理解為是閉包 全域性函式 不能捕獲值的閉包 方法 定義在例項中的函式,所以方法也能當閉包表示式處理 巢狀函式 作用區域小點,可以捕獲其封閉函式域內值的閉包。例如 引數和返回值為空元組 的表示式 func open ...