闭包 = 函数 + upvalue
函数是LuaVM指令、常量等的集合,upvalue是一些变量的集合。
我们平时所使用的函数都是闭包
举个例子:
local var = 0
local foo = function() var = 88 end
foo就是一个闭包,由一个函数和一个变量组成的。当然,即使下面的foo也可以被认为是一个闭包,即使它不包含任何upvalue。
local foo = function() end
善用闭包可以别写出简洁或者更易读的代码。
1、是代码更加易读。例如:
local function point(x, y)
return function() return x, y end
end
local function SetPos(point)
local x, y = point()
print(x, y)
end
SetPos(point(2, 3))
虽然增加了代码的复杂性,但是增加了易读性,而易于理解是写代码应该放在首位的。
2、减少全局变量
闭包还可以实现多个函数共享一个局部变量,从而不依赖于全局变量进行沟通,带来的好处是减少全局变量。
例如:
local function Person(age)
return {IncAge = function() age = age + 1 end,
ShowAge = function() print(age) end}
end
-- 测试
person = Person(18)
person.IncAge()
person.ShowAge()
person2 = Person(99)
person2.ShowAge()
person的两个函数共享了age变量,不依赖全局变量就完成了协作。而且person2的创建是不是有些类机制的意味呢?