Lua基礎系列 閉包

2021-10-14 17:27:33 字數 1236 閱讀 3875

歡迎來到lua高階系列的部落格

簡單來說就是:對於乙個函式,能夠訪問到外部函式的非全域性變數的一種機制。

說起來很繞,我們看乙個栗子

function func1 ()

local x = 1

-- 定義乙個內部函式

function func2 ()

print(x)

end-- 執行這個內部函式

這個例子就是在外部呼叫了func1函式,而func1中定義了乙個func2函式並呼叫了它。我們可以看到,func2訪問了屬於func1的local變數x,並且訪問成功了。按道理來講,x並不是全域性函式,也不是func2的區域性函式,應該是訪問不到的。而lua卻做到了,lua把實現這個功能的方式定義為閉包。所以從理論上來講,lua只有閉包沒有函式,函式只是不需要呼叫外部變數的乙個閉包的特例

【深入理解lua的閉包】

以下是對該部落格的一些總結歸納

1.當lua編譯乙個函式時,它會生成乙個原型(prototype),原型中包括函式的虛擬機器指令、函式中的常量(數值和字串等)和一些除錯資訊2.每個閉包都有乙個相應函式原型的引用以及乙個陣列,陣列中每個元素都是乙個對upvalue的引用,可以通過該陣列來訪問外部的區域性變數

上文提到函式是閉包的一部分,那麼簡而言之,如果訪問到外部的非全域性變數,那麼陣列則不為空。若沒有訪問到非全域性變數(普通函式),那麼閉包中的陣列就為空。而且該陣列對於這些非全域性變數會複製在upvalue中,因此閉包與閉包之間是的非全域性遍歷不會相互影響

舉個例子:

Lua基礎系列 之閉包

歡迎來到lua基礎系列的部落格 前文再續,書接上一回。今天要接著講lua中的閉包。在講閉包之前,我們首先了解一下第一類值和詞法定界這兩個概念 對於函式來說,第一類值指的是函式本身可以作為值賦值給變數,函式本身也可以作為引數傳遞給另外的函式。對於後者來說我們還比較容易理解,畢竟我們在各種高階語言裡面也...

lua閉包全面解析

在 lua中,閉包 closure 是由乙個函式和該函式會訪問到的非區域性變數 或者是 upvalue 組成的,其中非區域性變數 non local variable 是指不是在區域性作用範圍內定義的乙個變數,但同時又不是乙個全域性變數,主要應用在巢狀函式和匿名函式裡,因此若乙個閉包沒有會訪問的非區...

Lua的upvalue和閉包

lua函式 可以被當成引數傳遞,也可以被當成結果返回 在函式體中仍然可以定義內嵌函式。lua閉包是lua函式生成的資料物件。每個閉包可以有乙個upvalue值,或者多個閉包共享乙個upvalue數值。如果函式f2定義在函式f1中,那麼f2為f1的內嵌函式,f1為f2的外包函式,外包和內嵌都具有傳遞性...