У меня возникла проблема с циклом forTimeout.javascript for-loop и функция тайм-аута
for (var x = 0; x < 5; x++) {
var timeoutFunction = function() {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(), 1)
}
Я ожидаю выходного
Тем не менее, по какой-то причине они все выходные 5.
Переменная x
определяется в локальной области видимости из-за петли, так что я подумал, что это не может рассчитывать на обратный вызов от SetTimeout. Я тестировал с определением x
вне цикла for.
var x = 10
for (var x = 0; x < 5; x++) {
var timeoutFunction = function() {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(), 1)
}
я понял, этот вывод будет давать 10, но это не так. Тогда я подумал, что имеет смысл определить x впоследствии.
for (var x = 0; x < 5; x++) {
var timeoutFunction = function() {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(), 1)
}
var x = 10
Это делает возвращение только 10. Это означает, что обратные вызовы все называют после того, как для цикла выполняется? И почему они соответствуют только родительской области цикла for после того, как переменная инициализируется после выполнения цикла for? Я что-то упускаю?
Я знаю, как сделать этот пример работы с
for (var x = 0; x < 5; x++) {
var timeoutFunction = function(x) {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(x), 1)
}
Тем не менее, я действительно интересно, что не хватает ...
Спасибо за удивительные примеры и ссылки! Во-первых, я не мог полностью понять замечание о закрытии. Ссылка сделала это более понятным, а затем я понял точно, что вы имели в виду :) «Причина этого в том, что назначенная функция - это замыкание: она состоит из определения функции и захваченной среды из области действия. созданный циклом, но каждый из них имеет одну и ту же единую среду, в которой есть переменная с изменяющимся значением 'x'. Когда выполняются обратные вызовы setTimeout, доступ к' x' в этот момент вызывает это поведение " – jervtub
@jervtub Добро пожаловать. Закрытие - это, как правило, одна из самых сложных вещей, чтобы раздобыть свой разум, и они понимают немного практики. Не забывайте отмечать как ответ. Удачи! –