直接先上**,看看示例一的實現:
示例一:
sub make_new_counter;
}#**分析:
#匿名函式的父函式是make_new_counter,兩者間存在關聯關係,同時匿名函式返回給了標量$from_zero,
#這個標量函式還存在於當前上下文中,記憶體並未釋放,
#導致其關聯的父函式make_new_counter呼叫棧也未被釋放,因此計數start可以累加,
#類似於c語言中的state 關鍵字修飾區域性變數`state int start = 0`
#返回匿名函式引用,並且這個匿名函式帶有狀態
my$from_zero = make_new_counter(0);
my$from_three = make_new_counter(3);
#從零開始的計時器
$from_zero->();
$from_zero->();
#從三開始的計時器
$from_three->();
$from_three->();
執行結果:
013
4
閉包概念
閉包就是能夠讀取其他函式內部變數的函式,如上述**中的匿名函式。
閉包特徵
判斷是否是閉包,可以看以下兩個關鍵點:
沒有被建立它的上下文銷毀
引用了自由變數
自由變數就是沒有在函式塊中定義,也沒有從arguments中送入,也不在全域性上下文中定義的這些變數,如上述**中的start。
閉包作用
閉包可以用在許多地方。它的最大用處有兩個:
讓這些變數的值始終保持在記憶體中,如示例一
讀取函式內部的變數,如示例二
示例二:
sub city_name;}my
$city = city_name();
#正常情況下,區域性變數$city_name在函式呼叫結束後,對應的呼叫棧已經釋放,無法正常訪問,
#但是由於閉包的引入,使得$city_name一直存在於記憶體中,並未被釋放,所有可以正常訪問;
print
"name:",$city->();#輸出fuzhou
閉包劣勢
由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會影響效能。
閉包 Python中的閉包
通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...
python中 閉包 的使用
閉包 1.函式的再認識 函式名僅僅是乙個變數,只不過指向的是定義的函式體,通過函式名 可以呼叫該函式 如果函式名 被修改了,那麼再次執行函式名 時,呼叫的就不是之前的函式了 小結 1.函式名也是變數 2.可以把函式名當做引數來使用 2.閉包的結構 1.外部函式 外部函式返回內部函式的位址空間引用 2...
C 中閉包的使用
二.c 中閉包的實現 三.c 中使用閉包的注意事項 參考資料 1.維基百科中的閉包概念 在電腦科學中,閉包 closure 又稱詞法閉包 lexical closure 或函式閉包 function closures 是引用了自由變數 未繫結到特定物件 的函式。這個被引用的自由變數將和這個函式一同存...