function newcounter()
local i = 0
return function() -- anonymous function
i = i + 1
return i
endend
c1 = newcounter()
c2 = newcounter()
print(c1()) -->1
print(c1()) -->2
print(c2()) -->1
--閉包的自我理解:當newcounter將記憶體引用給c1時,會將**段和return結果的位址一起交給c1,
--當再次呼叫c1時,程式會將程式執行入口通過c1引用到上一次執行的位址上執行相同的**,
--所以結果會被保留,還可以疊加。當newcounter將記憶體引用給c2時,會重新分配記憶體。
一下為轉來的:
先看**:
newcounter = function(add)
local i = 0;
counter = function()
i = i + add
return i
endreturn counter
end
c1 = newcounter(1)
print(c1())
print(c1())
dolocal oldcounter = newcounter
newcounter = function(x)
return oldcounter(2*x)
endend
c2 = newcounter(1)
print(c2())
print(c2())
輸出: 1
2 2
4 1. lua中的函式是「第一類值」,就是說函式和整數,字串這些是一樣的,都可以儲存到變數中,看上面第一句的宣告。
2. 乙個closure就是乙個函式加上它訪問的所有「非區域性的變數」。上例中內部函式counter 的非區域性變數就是i和引數add,不管c1訪問多少次,都能取到這些非區域性變數的值。
3. 上例還展示了怎麼重新定義乙個函式,先把老函式儲存到乙個固定區域的區域性變數中,這樣外部就訪問不到這個newcounter函式了,然後重新寫新函式,新函式中可以呼叫老函式的實現。比如:上面的**就實現累計值翻倍的效果。
關於閉包的理解
發表一下關於閉包的理解 首先把每乙個函式看成乙個乙個的 小黑屋 小黑屋裡面可以看到外面的東西,但外面卻看不到小黑屋裡面的東西,就好比是函式可以訪問外面全域性變數,但是外面卻訪問不了 小黑屋 裡面的變數 變數分為全域性變數和區域性變數 列 函式可以訪問外面全域性變數 var a 1 function ...
關於閉包的理解
js複習決定把閉包這個特性好好研究清楚 閉包是一種函式特性把,函式包含子函式,通過子函式訪問自身變數,然後在講子函式返回,達到普通函式做不到的特性 普通函式可以訪問全域性變數,但是不能訪問其他函式的變數 var n 1 function f1 f1 1 function f2 f2 b is not...
關於閉包的理解
閉包官方定義 閉包是指程式中有許多變數和繫結變數的執行環境。本人自己理解 程式的 段允許存在一級函式並且一級函式不能被釋放,一級函式沒有釋放之前,外部可以使用一級函式的區域性變數。進一步理解 閉包就是外部可以使用區域性變數。閉包的功能 1 外部可以使用區域性變數。2 使函式不能釋放。閉包的缺點 外部...