Uzamknúť JavaScript: praktický príklad, funkcie a pravidlá

V obvode programovania alebo v anglickej verzii "uzáveru" - čo je spôsob, ktorým sa vykonáva miestny názov funkcie záväznou v jazyku prvej triedy. Okamžite predstavuje záznam, ktorý ukladá funkciu spolu s prostredím. Prostredie je porovnanie každej voľnej funkcie s hodnotou alebo odkazom názvu vytvoreného zatvorením v javascripte. Umožňuje prístup k zachyteným premenným prostredníctvom kópií hodnôt alebo odkazov, dokonca aj keď je volaný mimo oblasti.

Koncepcia obvody

[palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_491. JPEG [/palec]
uzáveru bola vyvinutá v roku 1960 pre mechanické vyhodnocovanie výrazov použitých vo výpočte, a v roku 1970 ako funkcia programovacieho jazyka PAL na podporu funkcie prvej triedy lexikálne rozsahu. Peter Landyn dal termín "uzavretie" v roku 1964, s prostredím a ovládacie časti na svojom počítači, používanú na hodnotenie SECD lambda výrazy súvisiace lexikálne prostredie, ktoré viedli k ich uzatvorenie alebo uzatvorenie v JavaScripte.


Toto vysvetlenie prišiel v roku 1975 ako obmedzené verzie LISP jazykovo a stal sa rozšírený. Lexikálne prostredie je súbor platných premenných v programe. Má vnútorné lexikálne prostredia a odkazuje na životné prostredie, tzv non-lokálne premenné. Lexikónové zámky v jazyku javascript sú funkcie s vonkajším prostredím. Rovnako ako javascript, všetky premenné majú odkaz na typ. JS používaiba odkazovanie - čo zodpovedá C ++ 11, a životnosť premenných lokálnych znakov zachytávaných funkciou sa rozširuje počas celej životnosti funkcie.
[palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_422.jpeg [/palec]

Funkcie najvyššej kvality

Blokovanie v jazyku javascript sa zvyčajne objavuje v jazykoch s prvotriednymi význammi. Takéto jazyky umožňujú prenos funkcií ako argumentov. Rovnako ako návrat z funkčných volaní a viazanie na názvy premenných. To sa deje rovnako ako jednoduché typy, ako napríklad riadky a celé čísla.


[palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_483 JPEG [/palec]
v tomto príklade je výraz lambda (lambda (kniha) (väčšie alebo rovné (knižné predajné kniha) prahová hodnota)) sa zobrazí v nástroji najpredávanejšieho-knihy. V prepočte lambda výraz vytvára schému, ktoré sa skladá z kódu pre expresiu lambda a odkaz na premenné prah, ktorý je voľný premenné vnútri výrazu lambda. Zámok potom prechádza filtračnou funkciou, ktorá ju vyvoláva opakovane, aby určila, ktoré knihy by sa mali pridať do zoznamu výsledkov a ktoré by sa mali zlikvidovať. Keďže hodnota prahu je uzamknutá, môže ju použiť pri každom vyvolaní jeho filtra. Vlastná filtračná funkcia môže byť definovaná v úplne samostatnom súbore. Tu je ten istý príklad, prepísaný v JS. Ukazuje, ako funguje zámok pod kapotou v jazyku javascript.
[palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_624.jpeg [/palec]
Kľúčové slovo sa tu používa namiesto funkcie globálneho filtra, ale v inej štruktúre a vplyve kódu existujeto isté. Táto funkcia môže vytvoriť okruh a vrátiť ho, pretože prechádza v tomto prípade funkcia f premenných dx, a ďalej fungovali potom, čo derivát, a to aj v prípade, že výkon je nechal vo svojom rozsahu a sú už viditeľné.
V jazykoch bez zámkov sa životnosť automatickej lokálnej premennej zhoduje s vykonaním rámca zásobníka, kde je táto premenná deklarovaná. V jazykoch s uzávermi typu javascript a funkciami funkcie prežitia musí premenné naďalej existovať tak dlho, kým existujúce prepojenia s nimi existujú. To je najčastejšie realizované pomocou nejakej formy zberu odpadu.

Použitie

[palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_525. JPEG [/palec]
výhodou tohto obvodu je, že sa udržuje rozsah "viditeľnosti reťazca" vonkajšie alebo "rodič" prevedení kontextu. Toto správanie sa môže použiť niekoľkými spôsobmi a stalo sa užitočným nástrojom na zabránenie viacerým chybám jazyka JavaScript. Jedným z najbežnejších je problém "slučiek". Problém s cyklom nastáva, keď používateľ vytvorí cyklus a funkcie očakáva, že súčasná hodnota premennej zostáva v tejto novej funkcie, a to aj v prípade, že sa zmení v súvislosti s cyklami pred zavolaním nové funkcie. Uzávery sa používajú tak už žiadne referenčné transparentnosť, a preto už čistý funkcie, avšak sú bežne používané v nečistých funkčných jazykoch, ako sú systém. Aby sme pochopili, aký typ uzávierky v javascripte je potrebné zvážiť ich prípadypoužiť. V skutočnosti majú v praxi mnoho aplikácií:
  • Môžu sa použiť na definovanie riadiacich štruktúr. Napríklad všetky štandardné riadiace štruktúra Smalltalk, vrátane pobočiek (v prípade, /potom /iného) a slučky (a zároveň i pre), stanovené pomocou objektov, metód, ktoré sú zaisťovacie. Používatelia môžu tiež jednoducho použiť uzamknutie na určenie štruktúry riadenia. V jazykoch, ktoré realizujú ciele, môže to vytvoriť multi-funkčné prostredie, ktoré vám umožňujú komunikovať s dôvernými a zmeniť toto prostredie. Uzamknutie sa používa na implementáciu objektových systémov.
  • Vytváranie súkromných aj verejných metód premenných pomocou šablón modulov. Vzhľadom na to, že funkcie vrátenia zdedia funkciu rodičovskej funkcie, sú v tomto kontexte prístupné pre všetky premenné a argumenty.
  • To je užitočné v situáciách, keď je funkcia používa rovnaký zdroj pre každý hovor, ale vytvára zdroj pre neho. Táto okolnosť spôsobuje, že metóda je neúčinná, čo sa odstráni iba uzatvorením.
  • , fungujúci v JavaScripte

    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost- ta-pravila_546.jpeg [/palec]
    Podľa MDN (Mozilla Developer Center) «uzávierok - je funkciou nezávislej premennej, ktoré si" pamätá, prostredie svojho vzniku. ' A pravidlo, keď končí funkcia, už neexistujú miestne premenné. Pochopenie toho, ako funguje zámok v jazyku javascript, môžete zvážiť niekoľko mechanizmov. Prvá je formálna logika. Napríklad pomocou funkcie logName, ktoráprijíma jedno meno ako parameter a zaregistruje ho. Potom vytvorím slučku na vytvorenie zoznamu mien, nastavenie prvého časového limitu a potom volanie funkcie logName do aktuálneho názvu.
    V jazyku prvej triedy môže byť funkcia manipulovaná rovnakým spôsobom ako iné typy údajov, ako napríklad int alebo reťazec. Iba tento mechanizmus umožňuje užívateľom vytvárať úžasné veci, napríklad priradiť funkciu premenné pre ďalšie volanie alebo odovzdať ako parameter funkcie.
    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_177.jpeg [/palec]
    Tento princíp používajú mnohé subjekty, ako aj spracovatelia udalostí DOM. Spočiatku počúvajte udalosť a potom priraďte funkciu spätného volania, ktorá sa vyvolá pri každom spustení udalosti.
    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_428.jpeg [/palec]

    Anonymné funkcie

    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_469. jpeg [/thumb]
    Anonymná funkcia je funkcia bez názvu. Takmer noví programátori sa s nimi stretávajú každý deň bez toho, aby pochopili hru s číslami. Napríklad, vykonanie operácie sčítania, môže prejsť premenných, ako sú:

  • var x = 3;
  • y = 5;
  • môže byť z = x + y.
  • Alebo ak nemáte v úmysle opätovne spracovať čísla: var z = 3 + 5; Toto sú anonymné čísla. Pre anonymné funkcie ich môžete deklarovať, keď sa používajú "za behu" - bez prechodu premennej. Napríklad, čo robiť s funkciou predtým: Do (funkcia () {alert ("Ceci est une fonction anonyme.");}); Okrem toho existuje alternatívna funkcia deklarácie syntaxe ad,ktorý zdôrazňuje, že obe funkcie môžu zostať v anonymite a spoliehajú na jednoduché premenné, ktoré sú pohodlný spôsob, ako nainštalovať funkciu spätného volania.

    Definícia funkcií

    Jedná sa vlastne o rovnaký mechanizmus, ale v tomto bode, že bude vidieť, ako sa funkcia obvodu vnútri. Zdá sa, pretože funkcie sú veličiny, ako sú iní, žiadne dôvody, ktoré by im na mieste identifikovať. V jazyku nultého poriadku, ako je C, C ++ a Java, všetky funkcie sú definované na rovnakej úrovni viditeľnosti, v rovnakej triede alebo na celom svete. Na druhú stranu, miestne javascript funkcie zmizne, rovnako ako ostatné lokálne premenné, akonáhle materská funkciu končí, takže nie je vidieť z iných funkcií.
    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_6810.jpeg [/palec]
    to je naozaj ťažké, ale javascript je spôsob, ako sledovať viditeľnosť premenných, a to aj v dvoch smeroch. Udalosť globálne premenné v JavaScripte s rovnakým mechanizmom ako v Jave - komplexné objekty, polia, DOM a iné predmety odovzdávané formou odkazu, ako v nasledujúcom kóde: karte var = [51, 42, 69]; var Tab2 = tab. Pokiaľ karta a Tab2 - dva odkazy na rovnakých ukazovateľov tabuľky technicky riadený garbage collector. Funkcie sú tiež prenášané cez prepojenie. Variabilné globalFn už nie sú skryté. Tento postup umožňuje, aby robiť, že preukazuje problému na okruhu javascriptu.
    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_9511.jpeg [/palec]
    tu je návod, ako sa dostať na funkciu v miestnom kontexte, ak je funkcia spĺňa ďalšie lokálne premenné. jednoduchýpríklad: automatický prírastok, funkcia, ktorá vracia celé číslo, ktoré sa zvyšuje o 1 za každý hovor. Konkrétne je potrebná funkcia inc, ktorá sa správa takto: inc (); retourne 0 inc (); //retourne 1 inc (); //retourne 2 inc (); //retourne 3 //atď Pri zámku vyzerá takto: funkcia makeInc () {var x = 0; návratová funkcia () {return x ++;} var inc = makeInc (); Posledný riadok v čase, keď sa zavádza premenný funkciu inc, nesie niektoré premenné, ktoré sú v okolí, v tomto prípade, že X. Vytvára neviditeľný objekt okolo funkcie, ktorá obsahuje túto premennú. Tento objekt je funkciou zatvorenia javascriptu. V tomto prípade má každá kópia funkcie vlastný uzáver: var inc1 = makeInc (); var in2 = makeInc (); inc1 (); //0 inc1 (); //1 inc1 (); //2 inc2 (); //0 inc1 (); //3 inc2 (); //1 inc2 (); //2 Ako vidíte, zatváranie je v mnohých prípadoch veľmi užitočné.

    konflikty názvy premenných

    , aby sa zabránilo stretom názvy premenných bežne používaných názvov. V javascripte priestor názvov predstavuje objekty podobné ostatným.
    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5412.jpeg [/palec]
    Prirodzene, A. x a B. x nie sú jedna a tá istá premenná. Ale chcem spustiť skript bez nutnosti zachovania ostatných premenných, ak môžete použiť anonymný funkciu obvodu. To dáva trochu zvláštnu syntax. Aj keď dva riadky kódu v stredu skôr obyčajný na druhej strane, funkcia, ktorá sa pohybuje okolo, hral "za pochodu". Venujte pozornosť okrúhlym zátvorkám () na konci. A aby sa mohol vytvoriť okruh, samotná anonymná funkcia by mala byť obklopená okrúhlymi zátvorkami. Táto anonymná funkcia používa lokálnu premennú, odsek. To je všetkoSkvelý spôsob, ako zabrániť konfliktom názvov alebo nepríjemnosti, ale aj proti útokom XSS, používateľské premenné sú chránené, nikto ich nemôže zmeniť, aby ovplyvnili správanie skriptu. Existuje variant: () () {//} ()); Zároveň dávajte pozor na permutáciu zátvoriek. Rozdiel medzi týmito dvoma možnosťami je ťažké vysvetliť, pretože súvisia s tým, ako sa kód číta lexikálnym analyzátorom. V oboch prípadoch sa táto funkcia považuje za výraz, ale tento výraz sa nehodnotí súčasne. Nezabudnite, že prijíma dve páry okrúhlych zátvoriek: jednu okolo funkcie a jednu za ňou.

    javascript programovanie v cykloch

    Keď používateľ vykoná veľké objemy programovania javascript, je preňho ťažké vyhnúť sa cyklu. Niekto ho blázni, po ktorom prichádzajú k myšlienke, že každá implementácia javascriptu má vážnu chybu. Ak vývojár už má slučku, že nechce konvertovať používať funkciu iterátora, musí urobiť len zámok, v ktorom definuje nové premenné. Opravujú aktuálnu hodnotu premenných a menia sa na každú iteráciu. Metóda zachytenia premenných spočíva v tom, že externý obvod sa vykoná okamžite počas aktuálnej iterácie cyklu. Možno použiť jeden z týchto dvoch modelových prístupov
    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_7913. jpeg [/thumb]
    Teraz existuje ďalšie zjednodušené riešenie tohto problému, pretože kľúčové slovo let je podporované v prehliadači Firefox aj v prehliadači Chrome. Je to kľúčové slovo pre variabilný blok var. Nechajte pracovať kúzlo, pretože je to oznámenénová premenná j, ktorej hodnota je fixovaná uzáverom v rámci cyklu. Musíme však mať na pamäti, že to nebude existovať aj naďalej po skončení jedného opakovania slučky, pretože to lokálne.

    , a slučky funkcie

    Pre cyklus v JavaScript nie je daná, rovnako ako cyklus pre C alebo Java. V skutočnosti to vyzerá skôr ako PHP. Najdôležitejšie poznatky o cykloch v JS spočívajú v tom, že nevytvárajú oblasť pôsobenia. JS nemá blok rozsahu, len funkciu hlasitosti. Táto vlastnosť môže byť považovaná za nasledujúci fragment: function foo () {var bar = 1; pre (var i = 0; i. zámky a agregácie okruh - to nič, ako funkcia vnútri iných funkcií, a prenášané v inom kontexte Nazývajú sa uzáver, ako sa uzavrie, pretože lokálne premenné, ktoré sú do iných oblastí funkcie k dispozícii , napríklad čas, x je definovaný ako parametra foo, a var bar = foo

    () vracia 84. vráti foo k x. to je dôležité, pretože to pomáha vývojárom vytvárať funkcie v cykloch závisle premenná cyklu. Zoberme tento úryvok, ktorý priradí obslužnému prvku kliknutí rôznym prvkom: //elements je a 3 rray z prvkov DOM var hodnoty = ['foo', 'bar', 'baz'], alebo (var i = 0 l = elements.length; aj Prípadová štúdia JavaScript obvod v obvode v prípade, že používateľ je priamo nad source prehliadača, ., že môže čeliť problému, ako to môže robiť žiadne chyby syntaxe Ak sa spustí kód priamo v prehliadači, šance sú veľmi vysoké, nie kompilovať procesu kompilácie WebPack Možné riešenia :. //main.js funkciu práce (meno) { návratová funkcia (téma) {console.log (čo je $ {topic} v $ {name}); }} práca ('javascript') ('Closure'); Po prvé, funkcia sa nazýva anázov argumentu je úspešný. Teraz táto funkcia slovníka vráti aj funkciu, ktorá tiež akceptuje argument tejto témy. Táto funkcia registruje výstup a výstup má prístup k premennej. Táto oblasť ponúka Insider sa neobmedzuje iba na túto funkciu, pretože koncept sa nazýva uzavretie, pretože má prístup do tejto oblasti vonkajšieho parametra. Spätná funkcia má prístup k externej lexikálnej oblasti alebo kontextu. Ak je developer zavolá funkciu, ktorý tiež vráti ho, spočiatku volal variabilný funkcie sú vždy k dispozícii pre interné funkcie. Nasleduje príklad s nasledujúcim kódom.
    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5314.jpeg [/palec]

    príkladom vnútorných funkcií

    viac o uzavretí v JavaScripte a dať tak druhý príklad. Teraz je toto prostredie vykonávania zničené, ale názov parametra stále existuje. Vytvorí sa nové interné funkčné prostredie, ktoré je anonymnou funkciou. Má prístup do oblasti externého lexikálneho prostredia. To znamená, že premenná prostredia stále existuje, takže anonymný funkcia má prístup k názvu premennej vytlačené v konzole, ako je "Aký je okruh v javascriptu». Interná anonymná funkcia //main.js function factory () {var products = []; for (var i = 0 ;. i. Vytvorenie funkcie "on the fly" môže vytvoriť továrenské funkcie - functionFactory, ktorý vykonáva svoje vlastné problémy výsledná funkcia of bude fungovať uzavretie rastlina, ktorá si pamätá prostredie tvorba var functionFactory = function (num1) {return (num2) {return num1 * num2;}} Vyššie uvedená funkcia umožňuje preniesť jedno číslo funkcieFactory, potom funkciaFactory vráti zámok,pamäťová hodnota num1. Výsledná funkcia vynásobí pôvodný číselný znak č. 1, ktorý prešiel pri hovore. môže mult5 = functionFactory
    ; môže mult10 = functionFactory
    ; Vyššie uvedené jednoducho vytvára funkcie mult5 a mult10. Teraz môžete odkázať na niektorú z týchto funkcií zadaním nového čísla, ktoré chcete vynásobiť číslom 5 alebo 10. Teraz môžete vidieť výsledok. & gt; viac5
    15> viac
    25> viac
    30> mult10
    50 Lock je jedna z najsilnejších funkcií javascriptu, ale nemôže byť použitá správne bez pochopenia podstaty. Relatívne ľahko sa vytvárajú náhodne, preto sa nebezpečný uzáver javascriptu uzatvára. Ich vytváranie má potenciálne škodlivé účinky, najmä v niektorých bežných prostrediach webového prehliadača. Aby sa zabránilo náhodným kolíziám s nevýhodami a aby sa využili výhody, ktoré ponúkajú, je potrebné porozumieť ich mechanizmu.

    Súvisiace publikácie