11 примеров замыканий в JavaScript внутри циклов

11 примеров замыканий в JavaScript внутри циклов

1. Замыкание внутри цикла for

for (let i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000);
}

В данном примере, при выполнении кода, каждая итерация цикла создает свое собственное замыкание, где переменная i сохраняется в памяти. Замыкание позволяет каждому вызову функции setTimeout получить доступ к соответствующему значению i.

2. Замыкание внутри цикла forEach

const array = [1, 2, 3];

array.forEach(function(element) {
  setTimeout(function() {
    console.log(element);
  }, 1000);
});

В этом примере, функция forEach также создает замыкание для каждого элемента массива array. Каждый вызов функции setTimeout получает доступ к соответствующему элементу.

3. Замыкание внутри цикла while

let i = 0;

while (i < 3) {
  setTimeout(function() {
    console.log(i);
    i++;
  }, 1000);
}

В данном случае, замыкание создается для переменной i. Каждый вызов функции setTimeout получает доступ к изменяемому значению i и выводит его в консоль.

4. Замыкание с использованием let внутри цикла for

for (let i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000);
}

Использование ключевого слова let вместо var позволяет создавать новую переменную i для каждой итерации цикла. Это создает замыкание для каждого вызова функции setTimeout.

5. Замыкание с использованием функции-обертки

function createClosure(value) {
  return function() {
    console.log(value);
  };
}

for (let i = 0; i < 3; i++) {
  setTimeout(createClosure(i), 1000);
}

В этом примере, функция createClosure возвращает новую функцию, которая имеет доступ к переменной value. Это позволяет создать замыкание для каждого вызова функции setTimeout.

6. Замыкание с использованием IIFE

for (let i = 0; i < 3; i++) {
  (function(value) {
    setTimeout(function() {
      console.log(value);
    }, 1000);
  })(i);
}

IIFE (Immediately Invoked Function Expression) создает замыкание для каждой итерации цикла. Переменная value передается в анонимную функцию, которая затем передается в функцию setTimeout.

7. Замыкание внутри цикла for-of

const array = [1, 2, 3];

for (const element of array) {
  setTimeout(function() {
    console.log(element);
  }, 1000);
}

В этом примере, цикл for-of создает замыкание для каждого элемента массива array. Каждый вызов функции setTimeout получает доступ к соответствующему элементу.

Читайте так же  Как получить ответ от асинхронного вызова JavaScript

8. Замыкание внутри цикла for-in

const object = { a: 1, b: 2, c: 3 };

for (const key in object) {
  setTimeout(function() {
    console.log(object[key]);
  }, 1000);
}

В данном примере, цикл for-in создает замыкание для каждого свойства объекта object. Каждый вызов функции setTimeout получает доступ к соответствующему значению свойства.

9. Замыкание внутри цикла do-while

let i = 0;

do {
  setTimeout(function() {
    console.log(i);
    i++;
  }, 1000);
} while (i < 3);

В этом случае, замыкание создается для переменной i. Каждый вызов функции setTimeout получает доступ к изменяемому значению i и выводит его в консоль.

10. Замыкание внутри цикла for-await-of

async function* asyncGenerator() {
  yield 1;
  yield 2;
  yield 3;
}

(async function() {
  for await (const element of asyncGenerator()) {
    setTimeout(function() {
      console.log(element);
    }, 1000);
  }
})();

В этом примере, цикл for-await-of создает замыкание для каждого элемента, полученного из асинхронного генератора. Каждый вызов функции setTimeout получает доступ к соответствующему элементу.

11. Замыкание внутри цикла for-in с использованием Object.keys

const object = { a: 1, b: 2, c: 3 };

Object.keys(object).forEach(function(key) {
  setTimeout(function() {
    console.log(object[key]);
  }, 1000);
});

В этом примере, функция forEach создает замыкание для каждого свойства объекта object. Каждый вызов функции setTimeout получает доступ к соответствующему значению свойства.


В данной статье мы рассмотрели 11 примеров использования замыканий в JavaScript внутри циклов. Замыкания позволяют сохранять и использовать значения переменных внутри функций, даже после того, как они были объявлены. Это особенно полезно при работе с циклами, где каждая итерация может создавать свое собственное замыкание.