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
получает доступ к соответствующему элементу.
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 внутри циклов. Замыкания позволяют сохранять и использовать значения переменных внутри функций, даже после того, как они были объявлены. Это особенно полезно при работе с циклами, где каждая итерация может создавать свое собственное замыкание.