關於lua的閉包自我理解

2021-06-17 20:23:20 字數 1187 閱讀 3281

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 使函式不能釋放。閉包的缺點 外部...