Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2021, 21:32   #1
denis_alekss
Пользователь
 
Регистрация: 01.12.2020
Сообщений: 25
По умолчанию Не выполнение цикла for

Почему код срабатывает только тогда когда
Код:
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

Последний раз редактировалось denis_alekss; 31.01.2021 в 21:40.
denis_alekss вне форума Ответить с цитированием
Старый 01.02.2021, 12:29   #2
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 243
По умолчанию

Потому что var объявляет глобальную переменную и после цикла она равна 6. А т.к. такого элемента в массиве нет, то undefined.
FrosyaZZ вне форума Ответить с цитированием
Старый 01.02.2021, 21:16   #3
denis_alekss
Пользователь
 
Регистрация: 01.12.2020
Сообщений: 25
По умолчанию

а сам цикл не выполняется ни разу раз выводит 6?
denis_alekss вне форума Ответить с цитированием
Старый 02.02.2021, 02:16   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
	(function(j){
	setTimeout(function() {
		console.log(`fib[${j}] = ${fib[j]}`)
	},1500)
	})(i)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.02.2021, 12:17   #5
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 243
По умолчанию

Цитата:
Сообщение от denis_alekss Посмотреть сообщение
а сам цикл не выполняется ни разу раз выводит 6?
А 6 откуда взялось тогда? А строчки в консоли сами появились?
FrosyaZZ вне форума Ответить с цитированием
Старый 02.02.2021, 22:37   #6
denis_alekss
Пользователь
 
Регистрация: 01.12.2020
Сообщений: 25
По умолчанию

Цитата:
Сообщение от FrosyaZZ Посмотреть сообщение
А 6 откуда взялось тогда? А строчки в консоли сами появились?
Вывод такой в консоле на экран
Код:
fib[6] = undefined
если объявить в этой строке i как var:
Код:
for(var i = 0; i < fib.length; i++)
Я поэтому спросил, выполняется ли вообще цикл раз такой вывод в коде который написал в самом начале? и как в єтом коде выполняется условия цикла что происходит такой вывод что я выделил жирным шрифтом?

Последний раз редактировалось denis_alekss; 02.02.2021 в 22:41.
denis_alekss вне форума Ответить с цитированием
Старый 02.02.2021, 22:51   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
for(var i = 0; i < fib.length; i++){
    console.log(`fib[${i}] = ${fib[i]}`);
}
Так ведь нормальный вывод в консоль? Почитайте про замыкания.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.02.2021, 12:30   #8
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 243
По умолчанию

Цитата:
Сообщение от denis_alekss Посмотреть сообщение
Вывод такой в консоле на экран
Именно. Прочитайте, что сами пишите. Как переменная могла стать 6, если цикл не выполняется? Еще раз: цикл выполнился, i СТАЛА 6, запустились ваши выводы, которые захватили переменную -> вот и выводится fib[6]
FrosyaZZ вне форума Ответить с цитированием
Старый 03.02.2021, 18:33   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Там еще неприметная циферка 6 слева в консоли, что значит, что данная строка вывелась 6 раз подряд.
Изображения
Тип файла: png fib6.png (1.5 Кб, 14 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.02.2021, 21:17   #10
denis_alekss
Пользователь
 
Регистрация: 01.12.2020
Сообщений: 25
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Там еще неприметная циферка 6 слева в консоли, что значит, что данная строка вывелась 6 раз подряд.
Про замыкания прочитал, что смысл в том чтобы создать ссылку на внешнюю функцию из внутренней, используя переменные внешней.
Значит вывод все-таки был 6 раз только с undefined, просто я не делал ссылку на переменную внешней функции.

Код:
const fib = [1,2,3,5,8,13]
for(var i = 0; i < fib.length; i++){
	(function(j){
	setTimeout(function() {
		console.log(`fib[${j}] = ${fib[j]}`)
	},1500)
	})(i)
}
Вот так сработал вывод потому что за каждой итерацией цикла передаю значение i из внешней функции во внутренюю, тем самым делая замыкание.
denis_alekss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выполнение оставшегося цикла komra2 C# (си шарп) 1 13.06.2016 16:16
Выполнение частей цикла Girei Visual C++ 1 17.03.2016 23:22
Sleep останавливает выполнение всего в программе а не задерживает выполнение конкретного куска кода? Illusiony Общие вопросы Delphi 19 22.02.2015 18:37
Выполнение цикла до нажатия определенной клавиши apeorin Общие вопросы C/C++ 12 13.11.2012 23:54
Ускорить выполнение цикла elen_7C9 Общие вопросы C/C++ 5 21.10.2012 22:06