Почему эти два, казалось бы, идентичных фрагмента кода ведут себя по-разному в Javascript и Lua?Разница в закрытии между 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 распечатывает . Может ли кто-нибудь объяснить разницу между закрытиями в Javascript и Lua, которые заставляют это произойти? Я исхожу из фона Javascript, поэтому, пожалуйста, сосредоточьтесь на стороне Lua.
Я попытался объяснить это на my blog, но я не уверен, что мои объяснения верны, поэтому любые разъяснения будут оценены.
EDIT
Спасибо всем, теперь я понимаю. Это слегка измененный вариант кода отпечатков 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()
Но в обоих случаях '' i' и j' были объявленные в самой внешней области (в функции 'main'), поэтому они должны иметь одинаковую область действия на обоих языках. –
@FlightOdyssey: это неверно для случая Lua. Lua for loops всегда объявляют новую переменную, поэтому переменная в цикле является новой переменной для каждой итерации. Заявление «local i», которое вы сделали, будет затенено и проигнорировано (если вы удалите его, результат будет таким же). – hugomg
@ missingno: О, я вижу - спасибо! –