閉包的探索

2021-09-19 02:59:34 字數 1077 閱讀 1291

對閉包的具體定義有很多種說法,這些說法大體可以分為兩類: 說法1:閉包是符合一定條件的函式,比如閉包是在其詞法上下文中引用了自由變數的函式。 說法2:閉包是由函式和與其相關的引用環境組合而成的實體。比如在實現深約束時,需要建立乙個能顯式表示引用環境的東西,並將它與相關的子程式**在一起,這樣**起來的整體被稱為閉包。

具體可以看這個文章《閉包的概念、形式與應用》

支援了閉包的語言有很多,這裡以go語言為例。

package main

import "fmt"

func add() func(int) int } func main() }

我們來看看執行結果:

0 0

1 -2

3 -6 6 -12 10 -20 15 -30 21 -42 28 -56 36 -72 45 -90

從結果可以看出來,在迴圈裡面每次順序呼叫pos, neg兩個函式,即連續呼叫兩次上述匿名函式。

第一次迴圈體執行之後結果都為0就不說了;第二次迴圈體執行時呼叫pos時引數為i=1,經過呼叫pos函式(內部對區域性變數sum+i)返回的sum變為1;呼叫neg時引數為i=1,經過呼叫pos函式(內部對區域性變數sum+(-2*i))返回的sum變為-2。

注意,呼叫neg時並沒有因為呼叫pos使sum變為1,而在sum=1的基礎上做sum+(-2*i),sum仍是以0值進行計算。

第三次迴圈體執行時,pos和neg內部分別以自己上次呼叫返回的sum作為新值進行計算。

pos和neg內部的sum是互相隔離的,在pos呼叫之後呼叫neg,會將sum變為neg之前對應的sum值;neg呼叫之後呼叫pos,同樣也會將sum變為pos之前對應的值。這也就證實了上面關於閉包的說法2更確切一點。即閉包是函式和與其相關的引用環境打包之後的乙個整體

---未完待續---

posted @

2018-08-18 21:22

徐小賤的blog 閱讀(

...)

編輯收藏

探索c 之函式建立和閉包

動態建立函式 匿名函式不足之處 理解c 中的閉包 閉包的優點 大多數同學,都或多或少的使用過。回顧下c 中動態建立函式的進化 c 1.0中 public delegate string dynamicfunction string name public static dynamicfunction...

閉包 Python中的閉包

通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...

閉包 解決閉包問題

1 函式和對其周圍狀態 lexical environment,詞法環境 的引用 在一起構成閉包 closure 2 函式與函式所依賴的上下文環境組成閉包問題。3 閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數。var arr ...