您的位置:首页 > 编程语言 > Lua

Lua初识之再论函数闭包-十一

2014-12-27 17:46 323 查看

Lua初识之再论函数闭包

-----------------------------
function newCounter(n)
print("n = " .. n)
return function(b)
-- 匿名函数,newCounter()函数返回时调用了匿名函数 function()
return b
end

end

-- newCounter()的返回值,其实是 function()的返回值
newCounter(3)  -- 3 --调用newCouter(n)函数
newCounter(10) -- 10 --调用newCouter(n)函数

c1 = newCounter( 2) -- n = 2  --调用newCouter(n)函数
c2 = newCounter( 6) -- n = 6  --调用newCouter(n)函数

print( c1(5)) -- 5   --调用的其实是 function(b)
print( c2(5)) -- 5   --调用的其实是 function(b)
print( c1(5)) -- 5   --调用的其实是 function(b)
print( c2(5)) -- 5   --调用的其实是 function(b)
print( c1(5)) -- 5   --调用的其实是 function(b)
print( c2(5)) -- 5   --调用的其实是 function(b)

-------------------------
function newCounter()
local i = 0
return function()
i = i + 1
return i
end
end

c1 = newCounter()
print( c1()) -- 1
print( c1()) -- 2
print( c1()) -- 3

--匿名函数使用 upvalue i 保存他的计数,当我们调用匿名函数的时候
--i 已经超出了作用范围,因为创建 i的函数 newCounter已经返回了,然而
--Lua用壁报的思想正确处理了这种情况,简单的说闭包是一个函数加上它可以

正确访问
--的upvalues,如果我们再次调用newCounter,将创建一个新的局部变量i,

因此我们得到了一个作用在心得变量i上的闭包

------------------------
function newCounter()
local i = 0
return function()
i = i + 1
return i
end
end

c1 = newCounter()
c2 = newCounter()
print( c1()) -- 1
print( c2()) -- 1
print( c1()) -- 2
print( c2()) -- 2
print( c1()) -- 3
print( c2()) -- 3

--匿名函数使用 upvalue i 保存他的计数,当我们调用匿名函数的时候
--i 已经超出了作用范围,因为创建 i的函数 newCounter已经返回了,然而
--Lua用壁报的思想正确处理了这种情况,简单的说闭包是一个函数加上它可以

正确访问
--的upvalues,如果我们再次调用newCounter,将创建一个新的局部变量i,

因此我们得到了一个作用在心得变量i上的闭包
--由上可知 c1() 和 c2 调用的 i是独立的
-------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: