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.