一、Lua闭包
若将一个函数写在另外一个函数内部,那么这个位于内部的函数便可以访问外部函数中的局部变量,这个特性称之为closure,中文翻译为“闭包”。
二、实践分析闭包的实现
(一)、实例1:Lua指令逆向分析
function newCounter()
local i = 0
return function()
i = i+1
return i
end
end
c1= newCounter()
print(c1())
print(c1())
ChunkSpry交互模式反编译:
>function newCounter() local i = 0 return function() i = i+1; return i end end
; source chunk: (interactive mode)
; x86 standard (32-bit, little endian, doubles)
; function [0] definition (level 1)
; 0 upvalues, 0 params, 2 stacks
.function 0 0 2 2
.const "newCounter" ; 0
; function [0] definition (level 2)
; 0 upvalues, 0 params, 2 stacks
.function 0 0 0 2
.local "i" ; 0
.const 0 ; 0
; function [0] definition (level 3) //匿名函数:closure
; 1 upvalues, 0 params, 2 stacks
.function 1 0 0 2
.upvalue "i" ; 0
.const 1 ; 0
[1] getupval 0 0 ; i //R(0):=UpValue(0)
[2] add 0 0 256 ; 1 //i=i+1
[3] setupval 0 0 ; i //UpValue(0):=R(0),将寄存器0中的值写回UpValue(0)
[4] getupval 0 0 ; i //再次取出UpValue(0),为解下来的返回i做准备
[5] return 0 2
[6] return 0 1
; end of