1. 程式人生 > >Lua,JavaScript的閉包和迭代器筆記

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>

以上 程式碼沒什麼難度 所以就懶得解釋太多