Wcześniej wiedziałem, co to znaczy, ale teraz walczę ...
Czy to w zasadzie mówi document.onload
?
(function () {
})();
javascript
iife
Exitos
źródło
źródło
Odpowiedzi:
Jest to Natychmiast-wywoływana Funkcja Expression lub Iife za krótki. Wykonuje się natychmiast po utworzeniu.
Nie ma to nic wspólnego z żadnym programem obsługi zdarzeń dla jakichkolwiek zdarzeń (takich jak
document.onload
).Rozważ część w pierwszej parze nawiasów: .... jest to wyrażenie regularne. Następnie spójrz na ostatnią parę , która zwykle jest dodawana do wyrażenia w celu wywołania funkcji; w tym przypadku nasze wcześniejsze wyrażenie.
(function(){})();
(function(){})();
Ten wzorzec jest często używany podczas próby uniknięcia zanieczyszczenia globalnej przestrzeni nazw, ponieważ wszystkie zmienne używane w IIFE (jak w każdej innej normalnej funkcji) nie są widoczne poza jego zakresem.
Być może dlatego pomyliłeś tę konstrukcję z modułem obsługi zdarzeń
window.onload
, ponieważ jest ona często używana w następujący sposób:Korekta sugerowana przez Guffę :
Aktualizacja Ponieważ jest to dość popularny temat, warto wspomnieć, że IIFE można również napisać za pomocą funkcji strzałki ES6 (jak Gajus zauważył w komentarzu ):
źródło
function(){ var foo = '5'; }
To tylko anonimowa funkcja, która jest wykonywana zaraz po jej utworzeniu.
To tak, jakbyś przypisał ją do zmiennej i użył jej zaraz potem, tylko bez tej zmiennej:
W jQuery istnieje podobny konstrukt, o którym możesz myśleć:
Oto krótka forma wiązania
ready
wydarzenia:Ale powyższe dwa konstrukty nie są IIFE .
źródło
Wywołane natychmiast wyrażenie funkcyjne (IIFE) natychmiast wywołuje funkcję. Oznacza to po prostu, że funkcja jest wykonywana natychmiast po zakończeniu definicji.
Trzy bardziej popularne sformułowania:
Jeśli nie ma specjalnych wymagań dotyczących wartości zwracanej, możemy napisać:
Alternatywnie może to być:
Możesz nawet napisać:
źródło
31.new
”jest niepoprawną składnią;(function(){}());
1 - 1
i równie łatwotrue - function(){}
. To tylko jedna rzecz (operator odejmowania odrostka), ale z różnymi, nawet bezsensownymi operandami.Deklaruje funkcję anonimową, a następnie wywołuje ją:
źródło
arguments
jest wyjątkowy ; zgaduję, że odpowiadający właśnie przerzucił tam, gdzie idą nazwyTo znaczy, wykonaj natychmiast.
więc jeśli to zrobię:
Fiddle: http://jsfiddle.net/maniator/LqvpQ/
Drugi przykład:
źródło
Konstrukt ten nazywa się Wyrażeniem funkcji natychmiast wywołanej (IIFE), co oznacza, że zostanie natychmiast wykonany. Pomyśl o tym jako o funkcji wywoływanej automatycznie, gdy interpreter osiągnie tę funkcję.
Najczęstszy przypadek użycia:
Jednym z najczęstszych przypadków użycia jest ograniczenie zakresu zmiennej wykonanej za pośrednictwem
var
. Zmienne utworzone za pomocąvar
mają zakres ograniczony do funkcji, więc ta konstrukcja (która jest opakowaniem funkcji wokół określonego kodu) upewni się, że zakres zmiennej nie wycieknie z tej funkcji.W poniższym przykładzie
count
nie będzie on dostępny poza natychmiast wywołaną funkcją, tzn. Zakrescount
nie wycieknie z funkcji. Powinieneś dostaćReferenceError
, jeśli spróbujesz uzyskać do niego dostęp poza natychmiastowo wywoływaną funkcją.Alternatywa ES6 (zalecana)
W ES6 możemy teraz tworzyć zmienne poprzez
let
iconst
. Oba mają zasięg blokowy (w przeciwieństwie do tego,var
który ma zasięg funkcjonalny).Dlatego zamiast używać złożonej konstrukcji IIFE w przypadku użycia, o którym wspomniałem powyżej, możesz teraz napisać znacznie prostszy kod, aby upewnić się, że zakres zmiennej nie wycieknie z pożądanego bloku.
W tym przykładzie użyliśmy
let
definicjicount
zmiennej, któracount
ogranicza się do bloku kodu, który utworzyliśmy za pomocą nawiasów klamrowych{...}
.Nazywam to „Curly Jail”.
źródło
Nazywa się to IIFE (Natychmiastowe wywołanie funkcji). Jeden ze słynnych wzorców projektowych JavaScript, jest sercem i duszą współczesnego wzoru modułu. Jak sama nazwa wskazuje, wykonuje się natychmiast po utworzeniu. Ten wzorzec tworzy izolowany lub prywatny zakres wykonania.
JavaScript przed ECMAScript 6 używał zakresu leksykalnego, więc IIFE został użyty do symulacji zakresu bloków. (Dzięki zakresowi bloków ECMAScript 6 możliwe jest wprowadzenie słów kluczowych
let
iconst
). Odwołanie do problemu z zakresu leksykalnymSymuluj zakres bloków za pomocą IIFE
Korzyść wydajność wykorzystania Iife jest możliwość, aby przejść powszechnie używanych przedmiotów, takich jak globalne
window
,document
itd jako argument przez zmniejszenie odnośnika zakresu. (Pamiętaj, że JavaScript szuka właściwości w zasięgu lokalnym i w górę łańcucha aż do zasięgu globalnego). Dostęp do obiektów globalnych w zasięgu lokalnym skraca czas wyszukiwania, jak poniżej.źródło
Nie, ta konstrukcja tworzy po prostu zakres nazewnictwa. Jeśli rozbijesz go na części, zobaczysz, że masz zewnętrzny
To jest wywołanie funkcji. W nawiasie masz:
To anonimowa funkcja. Wszystko, co jest zadeklarowane za pomocą var w konstrukcie, będzie widoczne tylko w tym samym konstrukcie i nie zanieczyści globalnej przestrzeni nazw.
źródło
Jest to wyrażenie funkcji natychmiast wywołane w JavaScript:
Aby zrozumieć IIFE w JS, podzielmy to:
Przykład: Wypróbuj poniższe w konsoli Chrome. Są to wyrażenia w JS.
Przykład:
Jak działa wyrażenie funkcji:
- Gdy silnik JS uruchamia się po raz pierwszy (Kontekst wykonania - Utwórz fazę), ta funkcja (po prawej stronie = powyżej) nie zostanie wykonana ani zapisana w pamięci. Zmienna „witaj” ma przypisaną „niezdefiniowaną” wartość przez silnik JS.
- Podczas wykonywania (kontekst wykonania - faza wykonania) obiekt funkcji jest tworzony w locie ( jeszcze nie wykonany ), zostaje przypisany do zmiennej „witaj” i można go wywoływać za pomocą polecenia „witaj” („nazwa”).
3. Natychmiast wywołane wyrażenie Funtion:
Przykład:
Jak działa IIFE :
- Zauważ „()” natychmiast po deklaracji funkcji. Do każdego obiektu funkcji dołączona jest właściwość „CODE”, którą można wywołać. Możemy to nazwać (lub wywołać) za pomocą nawiasów klamrowych „()”.
- Więc tutaj, podczas wykonywania (kontekst wykonania - faza wykonania), obiekt funkcji jest tworzony i wykonywany w tym samym czasie - Więc teraz zmienna powitalna, zamiast mieć obiekt funkcji, ma wartość zwracaną (ciąg znaków)
Typowy przypadek użycia IIFE w JS:
Następujący wzór IIFE jest dość powszechnie stosowany.
b) Przywołujemy tę funkcję w tym samym czasie, używając () na jej końcu.
Ta funkcja jest tworzona i wykonywana jednocześnie (IIFE).
Ważna skrzynka dla IIFE:
IIFE dba o bezpieczeństwo naszego kodu.
- IIFE, będąc funkcją, ma własny kontekst wykonania, co oznacza, że wszystkie zmienne utworzone w nim są lokalne dla tej funkcji i nie są współużytkowane z globalnym kontekstem wykonania.
Załóżmy, że mam inny plik JS (test1.js) użyty w mojej aplikacji wraz z iife.js (patrz poniżej).
IIFE pomaga nam pisać bezpieczny kod, w którym nie mimowolnie zderzamy się z obiektami globalnymi.
źródło
To anonimowa funkcja wywołująca siebie .
Sprawdź objaśnienie W3Schools dotyczące funkcji wywoływania samodzielnego .
źródło
(function named(){console.log("Hello");}());
<- samodzielnie wykonywana funkcja o nazwieJest to anonimowa funkcja samo-wywołująca się. Jest wykonywany, dopóki jest zdefiniowany. Co oznacza, że ta funkcja jest zdefiniowana i wywołuje się natychmiast po definicji.
A wyjaśnienie składni jest następujące: funkcja w pierwszym
()
nawiasie to funkcja, która nie ma nazwy, a przy następnym();
nawiasie można zrozumieć, że jest wywoływana w momencie jej zdefiniowania. I możesz przekazać dowolny argument w tym drugim()
nawiasie, który zostanie przechwycony w funkcji, która jest w pierwszym nawiasie. Zobacz ten przykład:Tutaj przekazywany „obiekt” będzie dostępny w funkcji przez „obj”, ponieważ pobierasz go w podpisie funkcji.
źródło
Zacznij tutaj:
Włącz funkcję i nie będzie już globalna - twoim głównym celem.
Natychmiast wywołaj funkcję - ups:
Użyj nawiasów, aby uniknąć błędu składniowego:
Możesz pominąć nazwę funkcji:
To nie musi być bardziej skomplikowane.
źródło
Uncaught SyntaxError: Unexpected token )
raczej niż jakąkolwiek wzmiankę o funkcji strzałki. Czy mógłbyś podzielić się z nią skrzypcami, rzucając błąd funkcji strzałki?Samo-wykonująca się funkcja anonimowa. Jest wykonywany, jak tylko zostanie utworzony.
Jednym z krótkich i obojętnych przykładów, w których jest to przydatne, jest:
Zamiast tworzyć listę za każdym razem, tworzysz ją tylko raz (mniej kosztów ogólnych).
źródło
Samoczynne funkcje są zwykle używane do enkapsulacji kontekstu i unikania zmowy nazw. Wszelkie zmienne zdefiniowane w (function () {..}) () nie są globalne.
Kod
tworzy ten wynik:
Stosując tę składnię, unikniesz kolizji ze zmiennymi globalnymi zadeklarowanymi gdzie indziej w kodzie JavaScript.
źródło
var same_name = 1; var myVar = function() { var same_name = 2; console.log(same_name); }; myVar(); console.log(same_name);
Miałby ten sam wynik.Nazywa się IIFE - Natychmiastowe wywołanie funkcji. Oto przykład pokazujący jego składnię i użycie. Służy do określania zakresu stosowania zmiennych tylko do funkcji, a nie poza nią.
źródło
IIFE (Natychmiastowe wywołanie wyrażenia funkcyjnego) to funkcja, która jest wykonywana, gdy skrypt ładuje się i znika.
Rozważ poniższą funkcję zapisaną w pliku o nazwie iife.js
Powyższy kod zostanie wykonany zaraz po załadowaniu pliku iife.js i wyświetli „ Hello Stackoverflow ! „w konsoli narzędzi programistycznych”.
Aby uzyskać szczegółowe wyjaśnienie, patrz Wyrażenie funkcji natychmiast wywołane (IIFE)
źródło
Kolejnym przypadkiem użycia jest zapamiętywanie, w którym obiekt pamięci podręcznej nie jest globalny:
źródło
IIFE
Można również określić jako samodzielnego wywoływania funkcji anonimowej. Jego najczęstszym zastosowaniem jest ograniczenie zakresu zmiennej wykonanej przez var lub enkapsulacja kontekstu, aby uniknąć kolizji nazw.źródło
Powodem, dla którego używane są anonimowe funkcje, jest to, że nigdy nie powinny być wywoływane przez inny kod, ponieważ „konfigurują” kod, który JEST przeznaczony do wywołania (wraz z nadaniem zakresu funkcjom i zmiennym).
Innymi słowy, są one jak programy, które „tworzą klasy” na początku programu. Po ich utworzeniu (automatycznie) dostępne są tylko funkcje zwrócone przez funkcję anonimową. Jednak wszystkie pozostałe „ funkcje ukryte są nadal dostępne, wraz z dowolnym stanem (zmienne ustawione podczas tworzenia zakresu).
Bardzo fajny.
źródło
Poniższy kod:
nazywa się natychmiast wywołanym wyrażeniem funkcyjnym (IIFE).
Nazywa się to wyrażeniem funkcyjnym, ponieważ
( yourcode )
operator w Javascript wymusza jego wyrażenie. Różnica między wyrażeniem funkcji a deklaracją funkcji jest następująca:Wyrażenie jest po prostu zbiorem kodu, który można ocenić na jedną wartość . W przypadku wyrażeń w powyższym przykładzie ta wartość była pojedynczym obiektem funkcji .
Po uzyskaniu wyrażenia, które ocenia obiekt funkcji, możemy natychmiast wywołać obiekt funkcji za pomocą
()
operatora. Na przykład:Dlaczego to jest przydatne?
Kiedy mamy do czynienia z dużą bazą kodu i / lub importujemy różne biblioteki, zwiększa się prawdopodobieństwo konfliktu nazw. Kiedy piszemy pewne części naszego kodu, które są powiązane (i dlatego używają tych samych zmiennych) wewnątrz IIFE, wszystkie zmienne i nazwy funkcji są ograniczone do nawiasów funkcyjnych IIFE . Zmniejsza to szanse na konflikty nazw i pozwala na nazwanie ich bardziej nieostrożnymi (np. Nie trzeba ich poprzedzać).
źródło
W składni ES6 (publikowanie dla siebie, ponieważ ciągle ląduję na tej stronie w poszukiwaniu szybkiego przykładu):
źródło
Ta funkcja nazywa się funkcją samowywołania. Funkcja samo-wywołująca się (zwana również funkcją samowykonującą się) to funkcja bezimienna (anonimowa), która jest wywoływana (wywoływana) natychmiast po jej zdefiniowaniu.Przeczytaj więcej tutaj
Funkcje te polegają na tym, że gdy funkcja jest zdefiniowana, funkcja jest natychmiast wywoływana, co oszczędza czas i dodatkowe linie kodu (w porównaniu do wywoływania jej na osobnej linii).
Oto przykład:
źródło
Oto bardziej dogłębne wyjaśnienie, dlaczego warto tego użyć:
„Podstawowym powodem korzystania z IIFE jest uzyskanie prywatności danych. Ponieważ zmienna JavaScript obejmuje zmienne do ich funkcji zawierającej, świat zewnętrzny nie może uzyskać dostępu do żadnych zmiennych zadeklarowanych w IIFE”.
http://adripofjavascript.com/blog/drips/an-introduction-to-iffes-immed natychmiast-invoked-function-expressions.html
źródło
Jest to wyrażenie funkcyjne, oznacza natychmiastowe wywołanie wyrażenia funkcyjnego (IIFE). IIFE to po prostu funkcja wykonywana zaraz po jej utworzeniu. Zatem jeśli funkcja musi poczekać, aż zostanie wywołana do wykonania, IIFE jest wykonywany natychmiast. Stwórzmy IIFE na przykładzie. Załóżmy, że mamy funkcję add, która przyjmuje dwie liczby całkowite jako argumenty i zwraca sumę, co pozwala przekształcić funkcję add w IIFE,
Krok 1: Zdefiniuj funkcję
Krok 2: Wywołaj funkcję, zawijając całą deklarację funkcji w nawiasach
Krok 3: Aby natychmiast wywołać funkcję, wystarczy usunąć tekst „dodaj” z połączenia.
Głównym powodem korzystania z IFFE jest zachowanie zakresu prywatnego w ramach funkcji. Wewnątrz kodu javascript chcesz się upewnić, że nie zastępujesz żadnej zmiennej globalnej. Czasami możesz przypadkowo zdefiniować zmienną, która zastępuje zmienną globalną. Spróbujmy na przykładzie. Załóżmy, że mamy plik HTML o nazwie iffe.html, a kody wewnątrz tagu body to-
Cóż, powyższy kod zostanie wykonany bez żadnego pytania, teraz załóżmy, że usuniesz zmienną o nazwie dokument przypadkowo lub celowo.
skończysz w SyntaxError : redeclaration of non-configurable global property document.
Ale jeśli chcesz usunąć dokument z nazwą zmiennej, możesz to zrobić za pomocą IFFE.
Wynik:
Spróbujmy na innym przykładzie, załóżmy, że mamy obiekt kalkulatora taki jak poniżej
Cóż, działa jak urok, co jeśli przypadkowo zmienimy wartość obiektu kalkulatora.
tak, skończy się na TypeError: kalkulator.mul nie jest funkcją iffe.html
Ale za pomocą IFFE możemy stworzyć prywatny zakres, w którym możemy stworzyć inny kalkulator nazwy zmiennej i użyć go;
Wynik:
źródło
Myślę, że 2 zestawy nawiasów sprawiają, że jest to trochę mylące, ale widziałem inne użycie w przykładzie Google, użyli czegoś podobnego, mam nadzieję, że pomoże to lepiej zrozumieć:
więc jeśli
windows.app
nie jest zdefiniowany, towindow.app = {}
jest natychmiast wykonywany, więcwindow.app
jest przypisywany{}
podczas oceny warunku, więc wynik jest zarównoapp
iwindow.app
teraz{}
, więc wyjście konsoli to:źródło
Zwykle nie wywołujemy funkcji natychmiast po napisaniu jej w programie. Mówiąc najprościej, gdy wywołujesz funkcję zaraz po jej utworzeniu, nazywa się ona IIFE - fantazyjna nazwa.
źródło
Zwykle kod JavaScript ma zasięg globalny w aplikacji. Kiedy zadeklarujemy w nim zmienną globalną, istnieje szansa na użycie tej samej zduplikowanej zmiennej w innym obszarze rozwoju w innym celu. Z powodu tego powielania może wystąpić błąd. Możemy więc uniknąć tych zmiennych globalnych poprzez natychmiastowe wywołanie wyrażenia funkcyjnego, to wyrażenie jest samo-wykonującym się wyrażeniem. Kiedy tworzymy nasz kod wewnątrz tego IIFE wyrażeniu zmienna globalna będzie podobna do zasięgu lokalnego i zmiennej lokalnej.
Dwa sposoby na utworzenie IIFE
LUB
W powyższym fragmencie kodu „ var app ” jest teraz zmienną lokalną.
źródło