IIFE (” Immediately Invoked Function Expression ”) - немедленно вызываемое функциональное выражение.

У традиционной формы IIFE существует небольшая вариация, которую предпочитают некоторые разработчики: (function() { .. }()).

IIFE предназначен для того, чтобы вызывать функции для передачи аргументов.

Пример:

var a = 2;
 
(function IIFE(global) {
  var a = 3;
  console.log(a); // 3
  console.log(global.a); // 2
})(window);
 
console.log(a); // 2

Здесь передается ссылка на объект window, но параметру присваивается имя global, чтобы в программе существовало четкое стилистическое разграничение между глобальными и неглобальными ссылками.

Другое применение этого паттерна решает (второстепенную и специфическую) проблему с некорректной перезаписью значений идентификатора default по умолчанию, приводящей к неожиданным результатам. Если присвоить параметру имя undefined, но не передать значение этого аргумента, можно гарантировать, что идентификатор undefined действительно соответствует неопределенному значению в блоке кода:

undefined = true; // Создает ловушку для другого кода! // Не делайте так!z

(function IIFE(undefined) {
  var a;
  if (a === undefined) {
    console.log("Undefined is safe here!");
  }
})();

Еще одна вариация на тему IIFE меняет порядок вещей: выполняемая функция передается в последнюю очередь, после вызова и передаваемых параметров. Этот паттерн используется в проекте UMD (Universal Module Definition).

Некоторые разработчики считают, что он чуть более понятен, хотя и не столь компактен.

var a = 2;
(function IIFE(def) {
  def(window);
})(function def(global) {
  var a = 3;
  console.log(a); // 3
  console.log(global.a); // 2
});

Функциональное выражение def определяется во второй половине фрагмента, а затем передается как параметр (также с именем def) функции IIFE, определяемой в первой половине фрагмента.

Наконец, параметр def (функция) вызывается с передачей window как параметра global.