Что такое IIFE в JavaScript?
Определение
IIFE — Immediately Invoked Function Expression, то есть «немедленно вызываемое функциональное выражение». Это функция, которая объявляется как выражение и тут же выполняется, без отдельного вызова по имени.
Базовый синтаксис
Чтобы движок распознал функцию именно как выражение (а не как объявление функции, function declaration), её оборачивают в скобки:
(function () {
console.log('Выполнилось сразу же');
})();
// вариант с оборачиванием всего вызова
(function () {
console.log('Тоже сработает');
}());
// с стрелочной функцией
(() => {
console.log('IIFE на стрелочной функции');
})();
Если убрать внешние скобки у function () {}();, будет синтаксическая ошибка — парсер ожидает объявление функции (function declaration), а у него нет имени.
Зачем нужен IIFE
- Изоляция области видимости. Всё, что объявлено внутри IIFE, не попадает в глобальную область и не конфликтует с другим кодом (например, с другими скриптами на странице).
- Приватность через замыкания. IIFE часто используют для создания модуля с приватным состоянием и публичным интерфейсом:
const counter = (function () {
let count = 0; // приватная переменная, недоступна снаружи
return {
increment() {
count += 1;
return count;
},
getCount() {
return count;
},
};
})();
counter.increment();
console.log(counter.getCount()); // 1
console.log(counter.count); // undefined — переменная приватна
- Однократная инициализация. Когда код должен выполниться один раз при загрузке (например, настройка конфигурации, полифиллы, самозапускающийся асинхронный код через
asyncIIFE):
(async () => {
const data = await fetch('/api/init').then((r) => r.json());
console.log(data);
})();
Исторический контекст
До появления let/const (ES6) единственной областью видимости в JS была функциональная — var не создавал блочную область. IIFE был основным способом спрятать вспомогательные переменные и избежать их утечки в глобальный объект window. Это же лежит в основе module pattern, который активно применялся до появления ES-модулей.
Актуальность сегодня
С появлением let/const, блочной области видимости и нативных ES-модулей необходимость в IIFE для изоляции переменных снизилась. Но паттерн не исчез:
- Бандлеры (webpack, Rollup) оборачивают модули в IIFE при сборке в единый файл.
- UMD (Universal Module Definition) использует IIFE для поддержки разных систем модулей.
- В библиотеках, подключаемых через
<script>, IIFE защищает код от конфликтов с глобальными переменными страницы.
Итог
IIFE — это способ немедленно выполнить функцию и получить изолированную, часто приватную область видимости. Исторически — главный инструмент инкапсуляции в JS, сегодня — паттерн, который встречается «под капотом» сборщиков и в сценариях однократной инициализации.
Что хочет услышать интервьюер
Кандидат объясняет расшифровку аббревиатуры и разницу между function declaration и function expression
Показывает корректный синтаксис с оборачивающими скобками и объясняет, зачем они нужны
Упоминает изоляцию области видимости и защиту от засорения глобального объекта
Приводит пример с замыканием и приватными переменными (module pattern)
Понимает, где IIFE применяется сегодня — бандлеры, UMD, разовая инициализация
Пример: Базовый синтаксис IIFE
(function () {
const secret = 42; // переменная не видна снаружи
console.log('IIFE выполнилась', secret);
})();
// стрелочный вариант
(() => {
console.log('Стрелочная IIFE');
})();
Пример: Модуль со скрытым состоянием
const counter = (function () {
let count = 0; // приватная переменная благодаря замыканию
return {
increment() {
return ++count;
},
reset() {
count = 0;
},
};
})();
counter.increment();
counter.increment();
console.log(counter.increment()); // 3
Типичные ошибки
Не могут объяснить, зачем нужны внешние скобки, и почему без них будет SyntaxError
Путают IIFE с обычным вызовом именованной функции
Считают, что IIFE — устаревшая и бесполезная техника, не зная про использование в бандлерах и UMD
Не приводят пример с замыканием и приватным состоянием, ограничиваясь голым синтаксисом
Забывают, что let/const с блочной областью видимости во многих случаях уже не требуют IIFE для изоляции переменных


