關(guān)于閉包(上篇)

為什么寫這篇文章:網(wǎng)上關(guān)于閉包的解釋五花八門鸦采,很多人自己往往也未清楚閉包宾巍,就嘗試用蹩腳的語言去描述它,而閉包是一個相對抽象的赖淤、跨越語言的概念蜀漆,網(wǎng)上的這些說法往往夾帶了JS的私貨。所以本篇是我整理的三點(diǎn)關(guān)于閉包的權(quán)威資料咱旱,并沒有自己的私貨确丢。下面的資料有一些有趣的分歧,如果你發(fā)現(xiàn)了并且有興趣與我探討一下吐限,歡迎聯(lián)系我鲜侥。

一、MDN

英文版:

Closures are functions that refer to independent (free) variables (variables that are used locally, but defined in an enclosing scope). In other words, these functions 'remember' the environment in which they were created.

中文版:

Closures (閉包)是使用被作用域封閉的變量诸典,函數(shù)描函,閉包等執(zhí)行的一個函數(shù)的作用域。通常我們用和其相應(yīng)的函數(shù)來指代這些作用域狐粱。(可以訪問獨(dú)立數(shù)據(jù)的函數(shù))

閉包是指這樣的作用域舀寓,它包含有一個函數(shù),這個函數(shù)可以調(diào)用被這個作用域所封閉的變量肌蜻、函數(shù)或者閉包等內(nèi)容互墓。通常我們通過閉包所對應(yīng)的函數(shù)來獲得對閉包的訪問。

二蒋搜、IBMdeveloperworks

閉包并不是什么新奇的概念篡撵,它早在高級語言開始發(fā)展的年代就產(chǎn)生了。閉包(Closure)是詞法閉包(Lexical Closure)的簡稱豆挽。對閉包的具體定義有很多種說法育谬,這些說法大體可以分為兩類:

一種說法認(rèn)為閉包是符合一定條件的函數(shù),比如參考資源中這樣定義閉包:閉包是在其詞法上下文中引用了自由變量(注1)的函數(shù)帮哈。

另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體膛檀。比如參考資源中就有這樣的的定義:在實(shí)現(xiàn)深約束(注2)時,需要創(chuàng)建一個能顯式表示引用環(huán)境的東西,并將它與相關(guān)的子程序捆綁在一起宿刮,這樣捆綁起來的整體被稱為閉包互站。

這兩種定義在某種意義上是對立的,一個認(rèn)為閉包是函數(shù)僵缺,另一個認(rèn)為閉包是函數(shù)和引用環(huán)境組成的整體胡桃。雖然有些咬文嚼字,但可以肯定第二種說法更確切磕潮。閉包只是在形式和表現(xiàn)上像函數(shù)翠胰,但實(shí)際上不是函數(shù)。函數(shù)是一些可執(zhí)行的代碼自脯,這些代碼在函數(shù)被定義后就確定了之景,不會在執(zhí)行時發(fā)生變化,所以一個函數(shù)只有一個實(shí)例膏潮。閉包在運(yùn)行時可以有多個實(shí)例锻狗,不同的引用環(huán)境和相同的函數(shù)組合可以產(chǎn)生不同的實(shí)例。所謂引用環(huán)境是指在程序執(zhí)行中的某個點(diǎn)所有處于活躍狀態(tài)的約束所組成的集合焕参。其中的約束是指一個變量的名字和其所代表的對象之間的聯(lián)系轻纪。那么為什么要把引用環(huán)境與函數(shù)組合起來呢?這主要是因?yàn)樵谥С智短鬃饔糜虻恼Z言中叠纷,有時不能簡單直接地確定函數(shù)的引用環(huán)境刻帚。這樣的語言一般具有這樣的特性:

函數(shù)是一階值(First-class value),即函數(shù)可以作為另一個函數(shù)的返回值或參數(shù)涩嚣,還可以作為一個變量的值崇众。

函數(shù)可以嵌套定義,即在一個函數(shù)內(nèi)部可以定義另一個函數(shù)航厚。

三丶?xì)v史上閉包的第一次定義

閉包這個概念第一次出現(xiàn)在1964年的《The Computer Journal》上顷歌,由P. J. Landin在《The mechanical evaluation of expressions》一文中提出了applicative expression和closure的概念。

文中AE的概念定義如下:

We are, therefore, interested in a class of expressions about any one of which it is appropriate to ask the following questions:

Q1. Is it an identifier? If so, what identifier?

Q2. Is it a λ-expression? If so, what identifier or identifiers constitute its bound variable part and in what arrangement? Also what is the expression constituting its λ-body?

Q3. Is it an operator/operand combination? If so, what is the expression constituting its operator? Also what is the expression constituting its operand?

We call these expressions applicative expressions (AEs).

在AE的基礎(chǔ)上幔睬,閉包定義為:

Also we represent the value of a λ-expression by a bundle of information called a "closure", comprising the λ-expression and the environment relative to which it was evaluated. We must therefore arrange that such a bundle is correctly interpreted whenever it has to be applied to some argument. More precisely:

a closure has an environment part which is a list whose two items are:

(1) an environment

(2) an identifier or list of identifiers

and a control part which consists of a list whose sole item is an AE.

結(jié)語

本篇中一共摘取了三點(diǎn)資料衙吩,前兩點(diǎn)中閉包都是跟JS有少許混雜的,或者說跟lexical scope(詞法作用域)少許混雜的溪窒。想要認(rèn)識閉包的本質(zhì),還需要理解提出閉包的這篇的論文冯勉。所以下篇我會研讀一下《The mechanical evaluation of expressions》中純粹的 Closure澈蚌,敬請期待。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灼狰,一起剝皮案震驚了整個濱河市宛瞄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖份汗,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盈电,死亡現(xiàn)場離奇詭異,居然都是意外死亡杯活,警方通過查閱死者的電腦和手機(jī)匆帚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旁钧,“玉大人吸重,你說我怎么就攤上這事⊥峤瘢” “怎么了嚎幸?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寄猩。 經(jīng)常有香客問我嫉晶,道長,這世上最難降的妖魔是什么田篇? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任替废,我火速辦了婚禮,結(jié)果婚禮上斯辰,老公的妹妹穿的比我還像新娘舶担。我一直安慰自己,他們只是感情好彬呻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布衣陶。 她就那樣靜靜地躺著,像睡著了一般闸氮。 火紅的嫁衣襯著肌膚如雪剪况。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天蒲跨,我揣著相機(jī)與錄音译断,去河邊找鬼。 笑死或悲,一個胖子當(dāng)著我的面吹牛孙咪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巡语,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翎蹈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了男公?” 一聲冷哼從身側(cè)響起荤堪,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澄阳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拥知,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年碎赢,在試婚紗的時候發(fā)現(xiàn)自己被綠了低剔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡揩抡,死狀恐怖户侥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峦嗤,我是刑警寧澤蕊唐,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站烁设,受9級特大地震影響替梨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜装黑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一副瀑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恋谭,春花似錦糠睡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至材义,卻和暖如春均抽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背其掂。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工油挥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人款熬。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓深寥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贤牛。 傳聞我的和親對象是個殘疾皇子翩迈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354