Патрик и Ник очень помогли мне в понимании всего этого, поэтому я хотел бы подвести итог для всех, кто сталкивается с той же проблемой, что и я:
setTimeout (а также с некоторыми другими задержками по временитакие функции, как EventListeners), кажется, сохраняет обратный вызов как строку, а затем использует какой-то внутренний eval в этой строке, таким образом интерпретируя его как код.
Это вызывает проблемы с циклами и функциями с задержкой, так какссылка на переменную ссылается на конечный результат этого цикла или, возможно, на переменную, которая даже не является глобальной.
Насколько я понимаю, решение с помощью функции в функции решает эту проблему, даваястрока обратно как результат функции, которая затем содержит значение, а не ссылку на переменную (alert("1")
не alert(i)
).
Что касается сокращения кода, мой простой ум пришел кпростое решение.Поскольку ожидается, что обратный вызов будет строкой, почему бы не записать значение переменной в эту строку, а затем вернуть это обратно:
for (i=0;i<11;i++)
{
setTimeout("alert("+i+")",1000);
}
Объективно это, вероятно, не лучшее решение, но так как требует наименьшегоколичество кода и наименьшее количество ресурсов мозга, чтобы понять, как и почему это работает, в отличие от других решений, я могу работать с ним сейчас.
Еще раз спасибо Патрику, Нику и неизвестному парню, который снял свой ответчто нашли время помочь мне с этим!