Immediately Invoked Function Expression JavaScript

Immediately Invoked Function Expression IIFE albo po naszemu samowykonująca się funkcja. Wykona się ona tak szybko jak szybko program napotka ją w kodzie.

(function () {
  console.log("Twój szczęśliwy numerek to: 4");
})();

Gdy uruchomimy program zobaczymy napis „Twój szczęśliwy numerek to: 4”. Funkcja nie ma nazwy oraz nie jest przechowywana w żadnej zmiennej, oznacza to tyle, że uruchomi się, wykona swoją zawartość i przestanie istnieć w dalszych częściach kodu. Pierwszy otwarty nawias ( który kończy się ) informuję, że jest to wyrażenie, zaś ostatnie dwa nawiasy () mówią JavaScriptowemu kompilatorowi, żeby uruchomił, wywołał tą anonimową funkcję.

Charakterystycznym zastosowaniem dla tych funkcji jest to, że nie deklarujemy zmiennych globalnie, tylko jesteśmy w danym zakresie, scope, closures. To co jest w naszym zakresie, istnieje tylko w tej przestrzeni użycie zmiennej po za zakresem spowoduje, że tak zmienna nie istnieje:

(function () {
var a = 7;
  console.log("Twój szczęśliwy numerek to:",a); // wyświetli: Twój szczęśliwy numerek to: 7
})();

console.log(a); // Uncaught ReferenceError: a is not defined

Dzięki takiemu podejściu nie musimy się obawiać, że któraś z nazw zmiennych będzie już wcześniej zadeklarowana i nie będzie powodować problemów z nową zmienną o tej samej nazwie:

var a = 1;
(function () {
var a = 7;
  console.log(a); // 7
})();
console.log(a); // 1

Ten sam efekt uzyskamy używając bloku, warto pamiętać, że bloki nie stanowią zakresu, dlatego aby uzyskać powyższy przykład musimy użyć nowej koncepcji deklarowania zmiennej za pomocą let:

let z = 1;
{
  let z = 7;
  console.log(z); // 7
}
console.log(z); // 1

Warto zwrócić uwagę, że w tym przypadku aby uzyskać efekt z poprzedniego przykładu użyłem charakterystycznego słowa let. Dla tych którzy spotykają się pierwszy raz z let odsyłam do wpisu var, let, const w którym wytłumaczyłem czym jest let 🙂

 
Pozdro 🙂
 

4 komentarze

  1. Przykład z temp nie działa w strict mode, bo tworzy tzw. „implied global”. Poza tym nie bardzo widzę sens takiego działania – po to mamy IIFE, żeby nie wrzucać tego do globalnego scope.
    Już bardziej rozumiem:
    ( function temp() {}() );
    co pozwoli nam się odwoływać do całego IIFE wewnątrz jego scope.

  2. Może nie doczytałem , a może nie było 🙂 .
    W sumie rzecz oczywista. W każdym razie do wnętrza funkcji anonimowej można wstrzykiwać
    cokolwiek tak jak podczas wywołania dowolnej funkcji. Fajnie działa to np. z zewnętrznymi bibliotekami w ramach modułu e.g.

    (function ($) {
    console.log(„Twój szczęśliwy numerek to: 4”);
    })(jQuery);

    Pozdro.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*