Почему эти два, казалось бы, идентичных фрагмента кода ведут себя по-разному в Javascript и Lua?
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()