閉包的概念 形式與應用

2021-04-18 20:01:33 字數 1084 閱讀 4661

隨著硬體效能的提公升以及編譯技術和虛擬機器技術的改進,一些曾被效能問題所限制的動態語言開始受到關注,python、ruby 和 lua 等語言都開始在應用中嶄露頭角。動態語言因其方便快捷的開發方式成為很多人喜愛的程式語言,伴隨動態語言的流行,我們經常聽到乙個名詞——閉包,很多人會問閉包是什麼?閉包是用來做什麼的?本文匯集了有關閉包的概念、應用及其在一些程式語言中的表現形式,以供參考。
什麼是閉包?

閉包並不是什麼新奇的概念,它早在高階語言開始發展的年代就產生了。閉包(closure)是詞法閉包(lexical closure)的簡稱。對閉包的具體定義有很多種說法,這些說法大體可以分為兩類:

這兩種定義在某種意義上是對立的,乙個認為閉包是函式,另乙個認為閉包是函式和引用環境組成的整體。雖然有些咬文嚼字,但可以肯定第二種說法更確切。閉包只是在形式和表現上像函式,但實際上不是函式。函式是一些可執行的**,這些**在函式被定義後就確定了,不會在執行時發生變化,所以乙個函式只有乙個例項。閉包在執行時可以有多個例項,不同的引用環境和相同的函式組合可以產生不同的例項。所謂引用環境是指在程式執行中的某個點所有處於活躍狀態的約束所組成的集合。其中的約束是指乙個變數的名字和其所代表的物件之間的聯絡。那麼為什麼要把引用環境與函式組合起來呢?這主要是因為在支援巢狀作用域的語言中,有時不能簡單直接地確定函式的引用環境。這樣的語言一般具有這樣的特性:

這些概念上的解釋很難理解,顯然乙個實際的例子更能說明問題。lua 語言的語法比較接近偽**,我們來看一段 lua 的**:

清單 1. 閉包示例1

function make_counter()

local count = 0

function inc_count()

count = count + 1

return count

end return inc_countendc1 = make_counter()c2 = make_counter()print(c1())print(c2())

在這段程式中,函式 inc_count 定義在函式 make_counter 內部,並作為

本文**ibm developerworks中國

閉包的概念

因此 可以訪問外部函式的變數,其內部變數只能內部可訪問 閉包時塊級作用域,可以定義自己的變數,避免變數命名衝突,汙染外部變數 使用場景一 封裝私有變數,對外暴露get,set方法或其中一種 使用場景二 儲存外部函式的變數 使用場景三 使用場景三 當閉包被賦值給乙個生命較長的變數時,其所依賴的父函式的...

閉包的應用與理解

普通函式能完成大功能編寫,匿名函式能完成小功能 編寫,而且當作實參非常方便 而閉包比函式方便,擁有函式 的功能 類似於匿名函式 還能有 所需要使用資料 而面向對像,例項物件賦值給引數,裡面的引數和方法都有,但應用中往往只要一部分,而不是全部,故閉包的優點就能體現出來,就是比物件導向更輕量,不會有多餘...

閉包的7種形式

根據閉包的定義,我們知道,無論通過何種手段,只要將內部函式傳遞到所在的詞法作用域以外,它都會持有對原始作用域的引用,無論在何處執行這個函式都會使用閉包。接下來,本文將詳細介紹閉包的7種形式 最常用的一種形式是函式作為返回值被返回 var f function return n console.log...