• Теория
  • Теория

Чиним галерею

После знакомства с областями видимости и замыканиями, вернёмся к нашей задаче. Что же случилось у нас в коде? Почему программа не работает как надо?

for (var i = 0; i < thumbnails.length; i++) {
  thumbnails[i].addEventListener('click', function () {
    fullPhoto.src = photos[i];
  });
}

Обработчики, которые мы создали, используют значение счётчика i. Сложность в том, что обработчики срабатывают не сразу, а в момент наступления события. К тому моменту, когда первое событие клика выполняется, цикл полностью отработал, значение счётчика стало максимальным — 5, и функция-обработчик берёт именно это значение. Цикл не создаёт отдельную область видимости, это ведь не функция. Поэтому значение i находится в глобальной области и каждый обработчик обращается к этому значению 5. А у нас нет миниатюры с таким индексом и элемента в массиве photos, поэтому никакая картинка и не подставляется.

Как нам это исправить? Нам помогут замыкания!

Мы создадим функцию, которая будет принимать в качестве параметров миниатюру и подходящий элемент из массива photos. А уже внутри этой функции будем добавлять обработчики. Тогда каждый обработчик будет брать значения из своего замыкания — из параметров функции, в которой находится обработчик.

У каждого обработчика будет собственное замыкание, поэтому значения в обработчиках не будут повторяться, как это было раньше.

Давайте постепенно улучшим нашу программу так, чтобы она работала корректно.

Без JavaScript будущему разработчику никуда. Записывайтесь на профессиональный курс по JavaScript первого уровня, проходящий c 18 июня по 19 августа 2024. Цена 30 900 ₽

Минимальный вид табов
  • index.html
HTML
HTML

Вы перешли на другую страницу

Кликните внутри мини-браузера, чтобы поставить фокус в это окно.

100%
Бабушка Кекс

Притормози, дружище

Проходить вызовы части «Знакомство с событиями» тренажёра «Погружение в браузерный JavaScript» можно после регистрации и оформления подписки.