網上大部分關於閉包的例子如下:
function test()
local i=0
return function()//尾調用
i = i + 1
return i
end
end
c1=test()
c2=test()//c1,c2是建立在同一個函數,同一個局部變量的不同實例上面的兩個不同的閉包
//閉包中的upvalue各自獨立,調用一次test()就會產生一個新的閉包
print(c1()) -->1
print(c1()) -->2//重複調用時每一個調用都會記住上一次調用後的值,就是說i=1了已經
print(c2()) -->1//閉包不同所以upvalue不同
print(c2()) -->2
可以看到尾調用是直接return一個匿名function,我嘗試返回一個非全局函數,發現這樣子也是可以的:
--定義一個全局的newTest函數
function newTest()
print("call global function newTest")
return 1
end
function test()
local i = 0
local function newTest()
i = i + 1
return i
end
return newTest
end
這樣也可以:
function test()
local i = 0
local newTest = function()
i = i + 1
return i
end
return newTest
end
lua有一個尾調用機制,正確的尾調用是不消耗任何棧空間,它類似於goto函數。**尾調用的定義就是當一個函數的調用是另一個函數的最後一個動作時。**尾調用也讓迭代器和閉包沒有額外的開銷。