Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Не срабатывает цикл for


Автор: denisalekss 31.1.2021, 22:08
Почему код срабатывает только тогда когда 
Код
var i = 0;
 поменять на 
Код
let i = 0;
?
Если оставить код как есть вывод:

Код

fib[6] = undefined


Сам код:

Код

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <script>
const fib = [1,2,3,5,8,13]
for(var i = 0; i < fib.length; i++){
    setTimeout(function() {
        console.log(`fib[${i}] = ${fib[i]}`)
    },1500)
}

    </script>
</body>
</html>



Вот такой код:

Код
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <script>
const fib = [1,2,3,5,8,13]
for(var i = 0; i < fib.length; i++){
    (function(j){
    setTimeout(function() {
        console.log(`fib[${i}] = ${fib[i]}`)
    },1500)
    })(i)
}

    </script>
</body>
</html>

 выдаст также 
Код

fib[6] = undefined

Автор: Oldshelf 1.2.2021, 12:49
При использовании var сохраняется ссылка на переменную, а не её значение, как в случае с let. Цикл отрабатывает, i становится равной 6 и затем вызываются Timeout'ы, принимающие данное значение. Если объявить переменную через let, то в функцию, сразу при её вызове, будут передаваться значения переменной.

Кстати, во 2-ом примере нужно на 10-ой строке заменить j на i:
Код

(function(i){

- тогда будет взята локальная, а не глобальная переменная i, со значением на момент определения SetTimeout'ов.

Автор: _zorn_ 2.4.2021, 20:41
Банальная опечатка. Частенько такое было когда "почему не работает" )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)