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.