求真百科歡迎當事人提供第一手真實資料,洗刷冤屈,終結網路霸凌。

閉包檢視原始碼討論檢視歷史

事實揭露 揭密真相
前往: 導覽搜尋
閉包

來自 網絡 的圖片

閉包包含自由(未綁定到特定對象)變量;這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變量)。"閉包" 一詞來源於以下兩者的結合:要執行的代碼塊(由於自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和為自由變量提供綁定的計算環境(作用域)。在PHP、Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Go、Lua、objective c、swift 以及Java(Java8及以上)等語言中都能找到對閉包不同程度的支持。

簡介

什麼是閉包

"官方"的解釋是:所謂"閉包",指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。

相信很少有人能直接看懂這句話,因為他描述的太學術。我想用如何在Javascript中創建一個閉包來告訴你什麼是閉包,因為跳過閉包的創建過程直接理解閉包的定義是非常困難的。

評價

Scheme中的閉包

其他編程的語言主要採用的是閉包的第二種意義(一個與閉包毫不相干的概念):閉包也算一種為表示帶有自由變量的過程而用的實現技術。但Scheme的術語"閉包"來自抽象代數。在抽象代數裡,一集元素稱為在某個運算(操作)之下封閉,如果將該運算應用於這一集合中的元素,產生出的仍然是該集合里的元素。

用Scheme的序對舉例,為了實現數據抽象,Scheme提供了一種稱為序對的複合結構。這種結構可以通過基本過程cons構造出來。過程cons取兩個參數,返回一個包含這兩個參數作為其成分的複合數據對象。請注意,一個序對也算一個數據對象。進一步說,還可以用cons去構造那種其元素本身就是序對的序對,並繼續這樣做下去。

(define x (cons 1 2)) //構造一個x序對,有1,2組成

(define y (cons 3 4))

(define z (cons x y))

Scheme可以建立元素本身也算序對的序對,這就是表結構得以作為一種表示工具的根本基礎。我們將這種能力稱為cons的閉包性質。一般說,某種組合數據對象的操作滿足閉包性質,那就是說,通過它組合起數據對象得到的結果本身還可以通過同樣的操作再進行組合。閉包性質是任何一種組合功能的威力的關鍵要素,因為它使我們能夠建立起層次性結構,這種結構由一些部分構成,而其中的各個部分又是由它們的部分構成,並且可以如此繼續下去。[1]

參考文獻

  1. 閉包搜狗