これら 2 つの一見同一のコードが、Javascript と Lua で異なる動作をするのはなぜですか?
ルア:
function main()
local printFunctions={}
local i,j
for i=1,10 do
local printi = function()
print(i)
end
printFunctions[i]=printi
end
for j=1,10 do
printFunctions[j]()
end
end
main()
Javascript:
function main()
{
var printFunctions=[]
var i,j;
for(i=0;i<10;i++)
{
var printi = function()
{
console.log(i);
}
printFunctions[i]=printi;
}
for(j=0;j<10;j++)
{
printFunctions[j]();
}
}
main()
Lua の例は を出力0 1 2 3 4 5 6 7 8 9
しますが、Javascript の例は を出力し10 10 10 10 10 10 10 10 10 10
ます。これを引き起こす原因となる Javascript と Lua のクロージャの違いを説明できる人はいますか? 私は Javascript のバックグラウンドを持っているので、Lua 側に注目してください。
私は自分のブログでこれを説明しようとしましたが、私の説明が正しいかどうかわからないので、明確にしていただければ幸いです.
編集
みんなありがとう、今私は理解しています。このわずかに変更されたバージョンの Lua コードは、期待どおりに 10,10,10,10,10,10,10,10,10,10 を出力します
function main()
local printFunctions={}
local i,j,k
for i=1,10 do
k=i
local printi = function()
print(k)
end
printFunctions[i]=printi
end
for j=1,10 do
printFunctions[j]()
end
end
main()