Lua,JavaScript的闭包和迭代器笔记

在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>

以上 代码没什么难度 所以就懒得解释太多

发布了38 篇原创文章 · 获赞 14 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/sinat_23156865/article/details/72964896