TGViewer
Frontend | Вопросы собесов Frontend | Вопросы собесов @easy_javascript_ru · 17.5K subscribers
Post #215 8.72K
В чём разница между видами замыкания ?
Спросят с вероятностью 3%

Замыкание (closure) — это функция, которая имеет доступ к переменным из своей внешней области видимости даже после завершения выполнения этой внешней функции. Однако, замыкания могут принимать разные формы в зависимости от их использования и контекста. Рассмотрим различные виды замыканий и их особенности.

Виды

1️⃣ Простое замыкание

Возникает, когда внутренняя функция имеет доступ к переменным внешней функции.
function outerFunction() {
let outerVariable = 'I am outside!';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}

const inner = outerFunction();
inner(); // 'I am outside!'

Здесь innerFunction замыкается на переменной outerVariable из внешней функции outerFunction.

2️⃣Замыкание с доступом к аргументам внешней функции

Внутренняя функция может также замыкаться на аргументах внешней функции.
function greet(greeting) {
return function(name) {
console.log(`${greeting}, ${name}!`);
};
}

const sayHello = greet('Hello');
sayHello('Alice'); // 'Hello, Alice!'

Здесь функция, возвращаемая greet, замыкается на аргументе greeting.

3️⃣Инкапсуляция данных

Часто используются для инкапсуляции данных, скрывая переменные и предоставляя доступ к ним только через функции.
function createCounter() {
let count = 0;
return {
increment: function() {
count++;
},
getCount: function() {
return count;
}
};
}

const counter = createCounter();
counter.increment();
console.log(counter.getCount()); // 1

В этом примере переменная count инкапсулирована и доступна только через методы increment и getCount.

4️⃣Частично применённые функции

Можно использовать для создания частично применённых функций, которые фиксируют некоторые аргументы.
function multiply(a) {
return function(b) {
return a * b;
};
}

const double = multiply(2);
console.log(double(5)); // 10

Здесь функция multiply создаёт частично применённую функцию, фиксируя аргумент a.

5️⃣Фабрика функций

Позволяют создавать функции, которые генерируют другие функции с определённым поведением.
function createGreeter(greeting) {
return function(name) {
console.log(`${greeting}, ${name}!`);
};
}

const helloGreeter = createGreeter('Hello');
helloGreeter('Bob'); // 'Hello, Bob!'

const hiGreeter = createGreeter('Hi');
hiGreeter('Charlie'); // 'Hi, Charlie!'

Здесь createGreeter создаёт новые функции для различных приветствий.

6️⃣Асинхронные замыкания

Играют ключевую роль в асинхронном программировании, так как позволяют сохранять контекст между асинхронными вызовами.
function fetchData(url) {
let data = null;

setTimeout(() => {
data = 'Data from ' + url;
console.log(data); // 'Data from example.com'
}, 1000);

return function() {
return data;
};
}

const getData = fetchData('example.com');
setTimeout(() => {
console.log(getData()); // 'Data from example.com'
}, 1500);

В этом примере замыкание сохраняет переменную data и позволяет к ней доступ после асинхронной операции.

7️⃣Рекурсивные замыкания

Могут быть использованы для создания рекурсивных функций, которые запоминают контекст и могут вызывать себя.
function createFactorial() {
return function factorial(n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
};
}

const factorial = createFactorial();
console.log(factorial(5)); // 120

Здесь factorial замыкается на самой себе, что позволяет реализовать рекурсивное вычисление факториала.

Замыкания (closures) — это функции, которые "запоминают" контекст, в котором они были созданы. Они могут использоваться для сохранения состояния, инкапсуляции данных, создания частично применённых функций, фабрики функций, работы с асинхронным кодом и рекурсией. Эти особенности делают замыкания мощным инструментом для управления данными и логикой.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1429 вопроса на Frontend разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
  • 👍 46
  • ❤ 12
  • 🔥 3
More from @easy_javascript_ru
  1. Oct 18, 2026Post #3049
  2. Oct 18, 2026🤔 Что такое делегирование? Делегирование событий (Event Delegation) — это техника, при ко…
  3. Oct 17, 2026🤔 Откуда взялся CSS? CSS (Cascading Style Sheets) появился в 1996 году для отделения стил…
  4. Oct 17, 2026🤔 Какие значения будут являться falsy значениями? В JavaScript значения, которые при прив…
  5. Oct 16, 2026🤔 Что такое meta теги? Meta-теги – это специальные HTML-теги, которые содержат метаинформ…
  6. Oct 15, 2026🤔 Какие преимущества у di? Dependency Injection (DI) – это паттерн проектирования, которы…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →