Jaki jest termin anonimowej funkcji JavaScript, która jest wywoływana natychmiast?

29

Piszę przewodnik po języku JavaScript dla mojego zespołu, abyśmy mogli łatwiej organizować i przekazywać nasze dokumenty. Ale uderzyłem w niewielki guz, do którego odnosi się moje pytanie ...

Jak mam nazwać anonimową funkcję JavaScript, która jest wywoływana natychmiast. Wiem, że mógłbym po prostu nazwać to „funkcją anonimową”, ale chciałbym podkreślić fakt, że jest ona wywoływana natychmiast.

Oto przykład:

var MyVariable = (function(data){
  return "another value"
})("some value"); 

console.log(MyVariable);
// "another value"
silentBeep
źródło
1
Zauważ, że często zobaczysz ten konstrukt (niedokładnie) określany jako „funkcja
samowywołania

Odpowiedzi:

39

Mają już na to określenie w świecie Javascript. Są one nazywane Wyrażeniami funkcji natychmiast wywołanych (IIFE) .

Co to jest

Funkcje IIFE nie mają nazwy. Zamiast tego są one wykonywane raz, gdy natrafi na nich tłumacz:

var area = function() {
    var width = 3;
    var height = 2;
    return width * height;
}();

Te końcowe nawiasy po zamknięciu nawias klamrowy bloku kodu powiedzieć tłumacza natychmiast wezwać wyrażenie funkcyjne.

Jeśli piszesz deklarację funkcji , musisz dodać operatory grupowania lub nawiasy otaczające funkcję, aby powiedzieć tłumaczowi, aby traktował funkcję jako wyrażenie, które można natychmiast wywołać:

var area;
(function() {
    var width = 3;
    var height = 2;
    area = width * height;
}());


Kiedy są używane

IIFE są używane dla kodu, który musi zostać uruchomiony tylko raz w ramach zadania, a nie wywoływany wielokrotnie.

  1. Jako argument przy wywołaniu funkcji (w celu obliczenia wartości itp.)
  2. Aby przypisać wartość właściwości do obiektu.
  3. W modułach obsługi zdarzeń i słuchaczach.
  4. Aby zapobiec konfliktom między dwoma skryptami, które mogą używać tych samych nazw zmiennych. Mogą być używane jako opakowania do upuszczania kodu w innym skrypcie, w którym nie masz pewności, czy nazwy zmiennych mogą być takie same.
Lawrence Aiello
źródło
Jeden nitpick: W twoim przykładzie var area = ...nie potrzebujesz „zawijania” nawiasów na funkcji, ponieważ jest to już wyrażenie funkcji z racji tego, że znajduje się po prawej stronie =. Nawiasy owinięte są potrzebne tylko wtedy, gdy funkcja jest zapisana jako deklaracja funkcji (tj. Bez wiodącego var area = ...).
Eric King,
@EricKing czy zrobiłem to dobrze?
Lawrence Aiello,
Przyjemnie byłoby móc swobodnie nazywać te „funkcje ekspresowe”
filtr
@LawrenceAiello Dodałem zmianę, aby pokazać, co miałem na myśli. Mam nadzieję, że nadal działa dla Ciebie.
Eric King,
Jako powiązane pytanie, czy istnieje jakikolwiek powód, aby przekazać argument do IIFE, jak pokazuje to pytanie? Widziałem je tylko tak, jak demonstrujesz - bez żadnych argumentów (ponieważ każdy argument może być zmienną lokalną).
Kat