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

来源:互联网 发布:淘宝宝贝描述评分4.7 编辑:程序博客网 时间:2024/05/20 06:51

在JS中一直不太理解闭包这个概念 ,有幸在学习lua编程中重新理解了下闭包和迭代器
这个是书上的原文:
迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。在 Lua 中我们
常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。
迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来
自于哪里和将要前往哪里。闭包提供的机制可以很容易实现这个任务。记住:闭包是一
个内部函数,它可以访问一个或者多个外部函数的外部局部变量。每次闭包的成功调用
后这些外部局部变量都保存他们的值(状态)。当然如果要创建一个闭包必须要创建其外
部局部变量。所以一个典型的闭包的结构包含两个函数:一个是闭包自己;另一个是工厂(创建闭包的函数)。

--region *.lua--Date--此文件由[BabeLua]插件自动生成LuaTest = {}--这个是在 xlua中实现   下面这个是初始化函数LuaTest.init = function (args)    iterTest()    --SystemIter()endfunction list_iter (t)    local i = 0    local n = #t            --   集合的大小    return function ()                i = i + 1                if i <= n then return t[i] end            endendfunction 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)    endendfunction SystemIter()    t = {10, 20, 30}    for i, v in ipairs(t) do        print(v.."\t")    endendreturn 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>

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

原创粉丝点击