Что такое IIFE в JavaScript?

JuniorJavaScript · Frontend·Обновлено 23 августа 2026
Коротко
IIFE (Immediately Invoked Function Expression) — это функциональное выражение, которое объявляется и сразу же вызывается. Оно создаёт изолированную область видимости и не засоряет глобальный объект.

Определение

IIFE — Immediately Invoked Function Expression, то есть «немедленно вызываемое функциональное выражение». Это функция, которая объявляется как выражение и тут же выполняется, без отдельного вызова по имени.

Базовый синтаксис

Чтобы движок распознал функцию именно как выражение (а не как объявление функции, function declaration), её оборачивают в скобки:

(function () {
  console.log('Выполнилось сразу же');
})();

// вариант с оборачиванием всего вызова
(function () {
  console.log('Тоже сработает');
}());

// с стрелочной функцией
(() => {
  console.log('IIFE на стрелочной функции');
})();

Если убрать внешние скобки у function () {}();, будет синтаксическая ошибка — парсер ожидает объявление функции (function declaration), а у него нет имени.

Зачем нужен IIFE

  1. Изоляция области видимости. Всё, что объявлено внутри IIFE, не попадает в глобальную область и не конфликтует с другим кодом (например, с другими скриптами на странице).
  2. Приватность через замыкания. 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 — переменная приватна
  1. Однократная инициализация. Когда код должен выполниться один раз при загрузке (например, настройка конфигурации, полифиллы, самозапускающийся асинхронный код через async IIFE):
(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 для изоляции переменных

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Feature-Sliced Design

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.5
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее