在JS中一直不太理解闭包这个概念 ,有幸在学习lua编程中重新理解了下闭包和迭代器
这个是书上的原文:
迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。在 Lua 中我们
常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。
迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来
自于哪里和将要前往哪里。闭包提供的机制可以很容易实现这个任务。记住:闭包是一
个内部函数,它可以访问一个或者多个外部函数的外部局部变量。每次闭包的成功调用
后这些外部局部变量都保存他们的值(状态)。当然如果要创建一个闭包必须要创建其外
部局部变量。所以一个典型的闭包的结构包含两个函数:一个是闭包自己;另一个是工厂(创建闭包的函数)。
--region *.lua
--Date
--此文件由[BabeLua]插件自动生成
LuaTest = {}
--这个是在 xlua中实现 下面这个是初始化函数
LuaTest.init = function (args)
iterTest()
--SystemIter()
end
function list_iter (t)
local i = 0
local n = #t -- 集合的大小
return function ()
i = i + 1
if i <= n then return t[i] end
end
end
function iterTest()
t = {10, 20, 30}
iter = list_iter(t) -- creates the iterator
while true do
local element = iter() -- calls the iterator
if element == nil then break end
print(element)
end
end
function SystemIter()
t = {10, 20, 30}
for i, v in ipairs(t) do
print(v.."\t")
end
end
return LuaTest
--endregion
看到这里 我想到了js,这类语言也是有闭包这个概念的 ,所以我尝试着 码L码 恢复下js的功力 哈哈
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>testJs</title>
</head>
<body>
<script>
function buttonClick()
{
var t = [1,23,32,222];
iter = listIter(t);
while(true)
{
var temp = iter();
if(temp != null)
console.log(temp);
else
break;
}
}
function listIter(t)
{
var i = -1;
return function()
{ i = i+1;
//console.log(t.length);
if(i<t.length)
return t[i];
}
}
</script>
<button onclick = "buttonClick()">点击按钮</button>
</body>
</html>
以上 代码没什么难度 所以就懒得解释太多