Zablokuj w JavaScript: praktyczny przykład, funkcje i reguły

W obwodzie programowania lub w wersji angielskiej „zamknięcia” - metoda realizacji nazwę kontekstu funkcję wiązania w języku pierwszej klasy. Szybko reprezentuje rekord, który przechowuje funkcję razem ze środowiskiem. Środowisko jest porównanie każdej wolnej funkcji o nazwie wartości referencyjnej lub siedzibę obwodu w javascript. Umożliwia dostęp do przechwyconych zmiennych, poprzez kopie wartości lub łączy, nawet po wywołaniu poza obszarem.

układów Koncepcja

,
[kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_491. jpeg [/thumb]
zamknięcie zostały opracowane w 1960 roku do mechanicznego oceny wyrażeń użytych w obliczeniach, a w 1970 roku jako cechą języka programowania PAL wspierać funkcje pierwszej klasie zakresem leksykalnym. Peter Landyn dał określenie „zamknięcie” w 1964 roku, ze środowiskiem i część kontroli na maszynie służącej ocenie SECD wyrażeń lambda związanych środowisko leksykalne, które doprowadziły do ​​ich zamknięcia lub zamknięć w JavaScript.


Takie wyjaśnienie pojawiło się w 1975 r. Jako leksykalnie ograniczona wersja LISP i stało się powszechne. Środowisko leksykalne jest zbiorem poprawnych zmiennych w programie. Składa się z wewnętrznego środowiska leksykalnego i odniesień do środowiska zewnętrznego, tak zwanych zmiennych nielokalnych. Blokady Lexicon w javascript są funkcjami ze środowiskiem zewnętrznym. Podobnie jak javascript, wszystkie zmienne mają link do typu. JS używawiążące tylko na link - co odpowiada 11 i C ++ życia przesłuchów zmienne lokalne przechwyconych funkcji odnosi się do życia narzędzia.
[kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_422.jpeg [/kciuka],

Pierwszorzędne funkcje

Zawieszki w javascriptach zwykle pojawiają się w językach o pierwszorzędnym znaczeniu. Takie języki umożliwiają przekazywanie funkcji jako argumentów. Oprócz powracania z wywołań funkcji i łączenia z nazwami zmiennych. Zdarza się to tak, jak proste typy, takie jak wiersze i liczby całkowite.


[kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_483 .jpeg [/kciuka]
w tym przykładzie, N wyrażenie (lambda (książka) (i GT = (książka książki-sprzedaży) próg)) znajduje się w narzędziu najlepiej sprzedających-książek. W przeliczeniu ekspresja N tworzy schemat, który składa się z kodu do ekspresji lambda oraz odniesienie do zmiennej wartości progowej, która jest zmienna wolna wewnątrz ekspresji lambda. Blokada przekazuje następnie funkcję filtrującą, która wywołuje ją wielokrotnie w celu ustalenia, które książki powinny zostać dodane do listy wyników i które powinny zostać odrzucone. Ponieważ istnieje blokada wartości progu, ta ostatnia może używać go za każdym razem, gdy wywoływany jest jego filtr. Samą funkcję filtra można zdefiniować w całkowicie oddzielnym pliku. Oto ten sam przykład, przepisany w JS. Pokazuje, jak działa blokada pod maską w javascript.
[kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_624.jpeg [/kciuka],
Tutaj słowo kluczowe jest używane zamiast globalnej funkcji filtru, ale w innej strukturze i działaniu koduto samo. Funkcja może tworzyć obwód i wrócić, bo to przechodzi w tym przypadku funkcja f zmiennych dx i nadal funkcjonować po pochodna, nawet jeśli wydajność pozostawił je w zakresie, a oni nie są już widoczne.
W językach bez blokad czas życia automatycznej zmiennej lokalnej odpowiada wykonaniu ramki stosu, w której deklarowana jest ta zmienna. W językach z JavaScript funkcji automatycznych i Iife, zmienne powinny nadal istnieć tak długo, jak każdego istniejącego łącznika blokującego do nich. Najczęściej jest to realizowane za pomocą jakiejś formy zbierania śmieci.

Zastosowanie

[kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_525. JPEG [/kciuka]
zaletą układu jest to, że utrzymuje zakres „widoczność łańcuch” kontekst zewnętrzny lub „dominująca” wykonania. To zachowanie może być używane na kilka sposobów i stało się użytecznym narzędziem do zapobiegania wielu błędom JavaScript. Jednym z najczęstszych jest problem "pętli". Problem z cyklu występuje, gdy użytkownik tworzy cykl i funkcja przewiduje, że bieżąca wartość zmiennej pozostaje w tej nowej funkcji, nawet jeśli zmienia się w kontekście cykli przed wywołaniem nowej funkcji. Zamknięcia stosowane są więc już nie więzy przejrzystości i dlatego nie jest już czysta funkcji, jednak są one powszechnie używane w nieczystych języków funkcyjnych, takich jak schemacie. Aby zrozumieć, jakiego rodzaju zamknięcie w javascript, należy rozważyć przypadki ichużywać W praktyce mają one wiele zastosowań:
  • Można ich używać do definiowania struktur zarządzania. Na przykład wszystkie standardowe struktury zarządzania Smalltalk, w tym gałęzie (jeśli /następnie /else) i pętle (while i for), są określane przy użyciu obiektów, które są zablokowane. Użytkownicy mogą również łatwo korzystać z blokowania w celu określenia struktury kontrolnej. W językach, które implementują ten cel, możesz stworzyć jego wielofunkcyjne środowisko, pozwalające komunikować się poufnie i zmieniać to środowisko. Blokowanie służy do implementacji systemów obiektowych.
  • Tworzenie prywatnych i publicznych metod zmiennych za pomocą szablonów modułów. Ponieważ funkcje zwracające dziedziczą obszar funkcji rodzicielskich, są one dostępne dla wszystkich zmiennych i argumentów w tym kontekście.
  • Jest to przydatne w sytuacji, gdy funkcja wykorzystuje ten sam zasób dla każdego połączenia, ale tworzy zasób dla niego. Ta okoliczność sprawia, że ​​metoda jest nieskuteczna, co eliminowane jest tylko przez zamknięcie.
  • służący do JavaScript

    [kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost- TA-pravila_546.jpeg [/thumb]
    Zgodnie z MDN (Mozilla Developer Network) Zamknięcia «- jest funkcją zmiennych niezależnych, która” zapamiętuje "środowisko jego powstania". I, z reguły, gdy funkcja się kończy, jej zmienne lokalne już nie istnieją. Zrozumienie, jak blokada działa w javascript, można rozważyć kilka mechanizmów. Pierwsza to logika formalna. Na przykład za pomocą funkcji logName któraakceptuje jedną nazwę jako parametr i rejestruje ją. Następnie należy utworzyć pętlę FOR, aby przejść do listy nazw określonych 1st czas na zewnątrz i następnie wywołać Logname, która jest obecna nazwa. Funkcje językowe
    pierwszej klasy można manipulować w taki sam sposób, jak inne rodzaje danych, na przykład, int lub sznurkiem. Tylko ten mechanizm pozwala wielu tworzyć niesamowite rzeczy, na przykład przypisać funkcję do zmiennej dla jej kolejnego wywołania lub przekazać ją jako parametr funkcji.
    [kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_177.jpeg [/kciuka],
    Z tej zasady korzysta wiele podmiotów, a także moduły obsługi zdarzeń DOM. Początkowo słuchaj zdarzenia, a następnie przypisz funkcję wywołania zwrotnego, która będzie wywoływana za każdym razem, gdy zostanie wywołane zdarzenie.
    [kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_428.jpeg [/kciuka],

    działa anonimowy

    [kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_469. jpeg [/thumb]
    Funkcja anonimowa to funkcja bez nazwy. Prawie początkujący programiści spotykają się z nimi każdego dnia bez zrozumienia gry liczbami. Na przykład, wykonując operację Ponadto można przejść zmiennych, takich jak:

  • var x = 3;
  • Y = 5;
  • może z = x + y.
  • Lub jeśli nie zamierzasz ponownie przetwarzać liczb: var z = 3 + 5; To są liczby anonimowe. W przypadku anonimowych funkcji można je zadeklarować, gdy są używane "w locie" - bez przekazywania zmiennej. Na przykład, weź funkcję z wcześniejszą: wykonaj (function () {alert ("Ceci est un anione fonction.");}); Co więcej, istnieje alternatywna składnia reklamy deklaracji funkcji,co podkreśla, że ​​jednocześnie funkcje mogą być anonimowe i odwoływać się do prostych zmiennych, co jest wygodnym sposobem na ustawienie funkcji zwrotnej.

    Definicja funkcji

    Jest to rzeczywiście ten sam mechanizm, ale w tej kwestii będzie widział w jaki sposób funkcje obwodów wewnątrz. Jak widać, ponieważ funkcje są zmiennymi, podobnie jak inne, nie ma powodów, dla których można je określić lokalnie. W języku zerowego rzędu, takich jak C, C ++ i Java, wszystkie funkcje są określone na tym samym poziomie widoczności, w tej samej klasie lub globalnie. Z drugiej strony, lokalna funkcja javascript znika, podobnie jak inne zmienne lokalne, jak tylko zakończy się funkcja dominująca, więc nie jest widoczny z innymi funkcjami.
    [kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_6810.jpeg [/kciuka]
    To jest naprawdę trudne, ale javascript ma sposób na śledzenie widoczności zmiennych, a także na dwa sposoby. Wyznaczenie zmienna globalna w JavaScript z tego samego mechanizmu jak w Jawa - złożonych obiektów, macierze, DOM i innych przedmiotów przekazanych przez odniesienie, jak w poniższym kod Zakładka var = [51, 42, 69]; może tab2 = tab Gdzie, tab i tab2 - dwa łącza do tej samej tabeli, technicznie, te wskaźniki są zarządzane przez garbage collector. Wspomniane są również funkcje. Zmienna globalFn nie jest już ukryta. Porządek pozwala to zrobić, o czym świadczy przykład problemu zamknięcia javascript.
    [kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_9511.jpeg [/kciuka],
    Oto jak można uzyskać funkcję z kontekstu lokalnego, jeśli funkcja spełnia inne zmienne lokalne. Prosteprzykład: auto-increment, funkcja zwracająca liczbę całkowitą, która zwiększa się o 1 dla każdego połączenia. W szczególności wymagana jest funkcja inc, która zachowuje się w następujący sposób: inc (); //retourne 0 inc (); //retourne 1 inc (); //retourne 2 inc (); //retourne 3 //etc Z blokadą wygląda następująco: function makeInc () {var x = 0; return function () {return x ++;}} var inc = makeInc (); Ostatnia linia w momencie tworzenia zmiennej funkcji inc, niesie pewne zmienne, które są wokół, w tym przypadku x. Tworzy niewidoczny obiekt wokół funkcji zawierającej tę zmienną. Ten obiekt jest funkcją zamykania javascript. Ponadto, każda funkcja kopia posiada obwód var INC1 = makeInc (); var inc2 = makeInc (); inc1 (); //0 inc1 (); //1 inc1 (); //2 inc2 (); //0 inc1 (); //3 inc2 (); //1 inc2 (); //2 Jak widać, zamknięcie jest bardzo przydatne w wielu przypadkach.

    konfliktów nazwy zmiennych

    , w celu uniknięcia konfliktów nazwy zmiennych powszechnie stosowanych nazw. W javascriptu przestrzeń nazw reprezentuje obiekty podobne do innych.
    [kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5412.jpeg [/kciuka],
    Naturalnie A. x i B. x nie są jedną i tą samą zmienną. Ale jeśli chcesz po prostu uruchomić skrypt bez konieczności zachowania innych zmiennych, można użyć anonimowego funkcję obwodu. Daje to nieco dziwną składnię. Chociaż dwa wiersze kodu w środku są dość powszechne, z drugiej strony funkcja, która jest wokół, wykonywana jest w locie. Zwróć uwagę na okrągłe nawiasy () na końcu. I aby móc zrobić obwodu anonimową funkcję sama musi być otoczone nawiasami. Ta anonimowa funkcja używa zmiennej lokalnej, akapitu. To wszystkoZnakomity sposób na zapobieganie konfliktom nazw lub niezręczności, ale także przeciwko atakom XSS, zmienne użytkownika są chronione, nikt nie może ich zmienić, aby wpłynąć na zachowanie skryptu. Istnieje wariant: (function () {//} ()); W tym samym czasie zwróć uwagę na permutację nawiasów. Różnica między tymi dwiema opcjami jest trudna do wyjaśnienia, ponieważ odnoszą się do sposobu odczytu kodu przez analizator leksykalny. W obu przypadkach funkcja jest traktowana jako wyrażenie, ale to wyrażenie nie jest oceniane jednocześnie. Pamiętaj tylko, że akceptuje dwie pary nawiasów okrągłych: jedną wokół funkcji i jedną za nią.

    Cykl JavaScript programowania

    Gdy użytkownik wykonuje dużą ilość Javascript programowania, trudno jest uniknąć cykli. Ktoś rzuca to w szaleństwo, po czym dochodzi do wniosku, że każda implementacja javascriptu ma poważny błąd. Jeśli programista ma już pętlę, której nie chce konwertować, aby użyć funkcji iteratora, wszystko, co musi zrobić, to blokada, w której definiuje nowe zmienne. Ustalają bieżącą wartość zmiennych i zmieniają się w każdej iteracji. Metoda przechwytywania zmiennych polega na tym, że obwód zewnętrzny jest wykonywany natychmiast podczas bieżącej iteracji cyklu. Można użyć jednego z tych dwóch podejść modelowych
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_7913. jpeg [/thumb]
    Obecnie istnieje jeden uproszczone rozwiązanie tego problemu, ponieważ słowa kluczowego let jako obsługiwanego w Firefoksie, a w Chrome. Jest to słowo kluczowe dla bloku zmiennej var. Niech działa magicznie, bo to jest ogłoszonenowa zmienna j, której wartość jest ustalona przez zamknięcie w cyklu. Musimy jednak pamiętać, że nie będą istnieć po zakończeniu jednej iteracji pętli bo go lokalnie.

    , pętla funkcja

    cykl w JavaScript nie jest podane, jak również cykl C lub Java. W rzeczywistości wygląda bardziej jak PHP. Najważniejszą wiedzą na temat cykli w JS jest to, że nie tworzą obszaru działania. JS nie ma bloku zakresu, a jedynie funkcję objętości. Właściwość tę można rozważyć na następującym fragmencie: function foo () {var bar = 1; for (var i = 0; i. zamki i obwód Agregacja - to nic innego jak funkcji wewnątrz innych funkcji, i przesyłane w innym kontekście Nazywane są zamknięcie, ponieważ zamknąć ponieważ zmienne lokalne, które są dostępne dla innych obszarów funkcyjnych , np. czas, x jest definiowany jako bla parametru oraz zmienna bar = foo

    () zwraca 84. zwraca foo dostęp x. jest to ważne dlatego, że pozwala twórcom tworzyć funkcje w cyklu zależy od stopnia zmienne. Należy rozważyć ten fragment, który przypisuje moduł obsługi kliknięcia do różnych elementów: //elementy to a 3 rray DOM wartości elementów var = ['foo' 'bar', 'baz']; for (var i = 0 L = elements.length: i Studium JavaScript w obwodzie, gdy użytkownik znajduje się bezpośrednio nad przeglądarki źródłowego . może on zmierzyć się z problemem, jak można to zrobić żadnego błędu składni Jeśli wykonuje kod bezpośrednio w przeglądarce, szanse są bardzo wysokie, nie skompilować WebPACK proces kompilacji Możliwe rozwiązania. //main.js pracę function (name) { funkcja powrotu (topic) {console.log (Co to jest $ {topic} w $ {nazwa}); }} praca ("javascript") ("zamknięcie"); Najpierw funkcja jest wywoływana inazwa argumentu jest przekazywana. Teraz ta funkcja słownika zwraca również funkcję, która również akceptuje argumenty tematu. Ta funkcja rejestruje dane wyjściowe, a dane wyjściowe mają dostęp do zmiennej. W okolicy znajduje się Insider nie ogranicza się do tej funkcji, ponieważ koncepcja nazywa Zamknięcie, ponieważ ma dostęp do tego obszaru zewnętrznego parametru. Funkcja powrotu ma dostęp do zewnętrznego regionu leksykalnego lub kontekstów. Gdy programista wywołuje funkcję, która również zwraca ją, pierwotnie nazwane zmienne są zawsze dostępne dla funkcji wewnętrznej. Poniżej znajduje się przykład z następującym kodem.
    [kciuk] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5314.jpeg [/kciuka],

    przykładem funkcji wewnętrznych

    więcej na zamknięciu w JavaScript aby poinformować drugiego przykładu. Teraz środowisko wykonawcze zostanie zniszczone, ale nazwa parametru nadal istnieje. Tworzone jest nowe wewnętrzne środowisko funkcjonalne, które jest funkcją anonimową. Ma dostęp do obszaru zewnętrznego środowiska leksykalnego. Zatem zmienna nadal istnieje, tak aby funkcja anonimowa ma dostęp do nazwy zmiennej wydrukowanej w konsoli, takie jak: „Jaki jest obwód w JavaScript». Wewnętrzna anonimowa funkcja //fabryka //fabryka () {var products = []; for (var i = 0;. i. Tworzenie funkcji „w locie” można tworzyć funkcje fabryczne - functionFactory, który realizuje swoje własne problemy Powstały funkcyjnych zamknięcia roślin funkcji spowoduje, że pamięta środowiskową tworzenie var functionFactory = function (num1) {return funkcja (num2) {powrotu num1 * num2;}.} powyższy może przenosić numer functionFactory Następnie functionFactory obieg powrotny,wartość pamięci num1. Wynikowa funkcja mnoży oryginalny num1 razy wartość num2, która jest przekazywana podczas wywołania. can mult5 = functionFactory
    ; może mult10 = functionFactory
    ; Powyższe po prostu tworzy funkcje mult5 i mult10. Teraz możesz odwołać się do dowolnej z tych funkcji, przekazując nowy numer, który chcesz pomnożyć przez 5 lub 10. Teraz możesz zobaczyć wynik. & gt; mult5
    15 & gt; mult5
    25 & gt; mult10
    30 & gt; mult10
    50 Zablokuj to jedna z najmocniejszych funkcji javascript, ale nie można jej używać poprawnie bez zrozumienia istoty. Są stosunkowo łatwe do stworzenia przez przypadek, dlatego niebezpieczne zamknięcia javascript. Ich tworzenie ma potencjalnie szkodliwe skutki, szczególnie w niektórych popularnych przeglądarkach internetowych. Aby uniknąć przypadkowych kolizji z niedogodnościami i wykorzystać korzyści, jakie oferują, konieczne jest zrozumienie ich mechanizmu.

    Powiązane publikacje