1樓:manxisuo
閉包就是:乙個函式,以及與它關聯的環境。
回答完畢。
再囉嗦一句:閉包是一種封裝技術,像類一樣。類/物件是將n個函式和n個資料封裝到一起,閉包是將1個函式和n個資料封裝到一起。
以JS為例,可以用閉包實現的功能,通常也可以用類/物件的方式等價的實現。
參考:https://
zh.m.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)
2樓:
參照 baozii 的回答,我改寫了一下
這是乙個 Python的例子:
def f(n):
n=1return lambda x: x+n
g=f(2)
g(2)
這裡 g 為3,而不是4.
就是因為f(n)中 n=1 而產生的閉包,n 的值變得不可再初始化了
3樓:
如果對乙個集合中的每個元素執行某個運算操作,得到的結果還是這個集合的元素,那麼就說該集合在這個運算操作下構成閉包。
例如,整數集合在減法運算下構成閉包;但是自然數在減法運算下不構成閉包。
4樓:魏小喵
片面地講閉包就是 「北京城」,一層一層的控制,皇宮的皇上看上城內的妹子就可以用,城內的漢子要麼用城內的妹子,要麼去城外 =。=
5樓:安而遇
搬運一下 @winter 的blog 閉包概念考證 · Issue #3 · wintercn/blog · GitHub
6樓:謝龍恩
想理解閉包,得知道開包的情況.emacs-lisp就是乙個例子,它使用動態作用域,乙個函式中未定義的變數計算時會使用當前函式呼叫堆疊中最近的出現的同名變數的值.這樣的話,開包的未定義變數受函式呼叫的路徑的影響,這就是稱為開的原因,能帶來方便但也帶來很大的混亂.
早期的動態語言最終放棄了這種做法,採用了變數只受詞法作用域的影響的閉包.目前大部分程式語言都採用了這一做法.
7樓:補佳林
閉包是這樣的,在動態語言裡面,巢狀著定義函式時,函式體裡面會使用外部層次裡的區域性變數,當外層函式呼叫結束,而內層函式依然可以被訪問,內層函式呼叫的時候依然可以外部層次裡面的區域性變數。這個內層函式和他所用到的區域性變數就成為乙個閉包。
舉個lua的例子
function createObject()
local x = 5
local o = {}
o.add = function(y)
x = x + y
return x
endo.mul = function(y)
x = x * y
return x
endreturn o
end物件o只包含兩個函式域沒有資料域,卻似乎依然有內部狀態,因為它的成員函式包含了乙個共同的upValue(x)。這個就叫閉包。
由此可見閉包的好處
1 資料隱藏,即使用反射都看不到資料域,代價是多次建立會損失了一些效能,不過虛擬機器對這種操作應該有優化
2 upValue查詢比在全域性域裡面去查詢更快,所以有時候會把全域性變數建立乙個區域性變數的引用,然後作為upValue使用。比如常見的local tbl_inseret = table.insert
8樓:
閉包表現為跨scope引用,凡是這樣被引用過後,記憶體中存放閉包的資料就會變多一些,在銷毀之前一直存在。
閉包是有可能造成記憶體leak的哦。
9樓:shafreeck
閉包,就是你傳乙個函式當引數,這樣不夠,因為你想給函式設定一些狀態,也想將函式執行結果儲存。那就把變數跟函式包在一起,當做引數。 函式跟變數包在一起,就是閉包。
(尼瑪,這不就是物件嗎!!)
10樓:
希望你看 < 現代編譯原理-C 語言描述》 224 頁 -- 15.2 閉包。
你如果基礎不達標, 那」用人類語言「描述並讓你明白我覺得太難了。
閉包不是 lambda , 不要和數學扯到一塊。
11樓:James Zhan
在電腦科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變數的表示式(通常是函式)。這些被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。
詞法作用域(lexical scope)等同於靜態作用域(static scope)。所謂的詞法作用域其實是指作用域在詞法解析階段既確定了,不會改變。
閉包的資料結構可以定義為,包含乙個函式定義 f 和它定義時所在的環境(struct Closure (f env))1. 全域性函式是乙個有名字但不會捕獲任何值的閉包。
2. 巢狀函式是乙個有名字並可以捕獲其封閉函式域內值得閉包。
3. Lambda(閉包表示式)是乙個利用輕量級語法所寫的可以捕獲其上下文中變數值的匿名閉包。
12樓:Nimo
varglobalVal
=null
;varfn=
function()}
fn();
globalVal
();//2
globalVal
();//3
如果你只要簡單的解釋那麼就是這麼簡單,沒有那麼多的的長篇大論和return 。說多了或者寫很多return只會讓不了解閉包的人迷糊。
13樓:劉超
閉包可以想象成乙個你家電視的遙控器,在對面樓也可以控制你家電視。某天你跟面樓的女孩表白(呼叫女孩的『表白』函式),但不要她馬上給你答覆,你給了她乙個你家電視的遙控器(把閉包作為引數扔給『表白』函式),說如果答覆是 yes 就用遙控器開啟你家電視。然後你就去打 dota 了,內心默默等待亮起的電視。。。
隔壁女孩風中凌亂中 = =|||
如何通俗地解釋 n 維球面這個概念?
Mosbic 二維球面到三維球面有個很好玩的構造,就是之前有人說的suspension雙角錐,還有另外乙個構造叫做cone,中文錐。想象S1圓環為底作乙個錐面出來,就是S1和單位區間I作笛卡爾積,再把S1在1處的那個copy捏成乙個點,於是就是乙個錐啦。接著再把0處的S1也粘成乙個點,就是suspe...
如何通俗地解釋形而上預設這一概念?
哲學為何p開頭 1 本 God 末 2 形而太上者 G 謂之道 預設 形而上者謂之 1 人心 1 事物 形而 0 中間 形而下者謂之 2 生老 2 病死 d 天堂在哪路咋走?異名同謂,道在哪如何知?3 諸位,新 中國哲學的 形而上 中國人翻譯成 形上學 的 metaphysics 簡單清晰明白,難道...
如何通俗地解釋 C C C Java JavaScript HTML Python的用處?
Archeus 程式語言總的來說是跟計算機硬體互動的語言。比如 傳送 你好 小明 不同的計算機語言的單詞,標點,語法不同。它們各有各的側重點,有的擅長網路通訊,有的擅長顯示影象,有的語法嚴謹,有的簡約易用。對於想入門卻又不知道選哪門語言的同學,我的建議是 在當前流行的語言當中任選一門立刻開始學習,不...