Lua,JavaScript的閉包和迭代器筆記
阿新 • • 發佈:2019-01-31
在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>
以上 程式碼沒什麼難度 所以就懶得解釋太多