Zakleni v JavaScriptu: praktični primer, značilnosti in pravila

Pri programiranju zaprtja ali v angleški različici "zaprtja" - je metoda izvajanja kontekstnega imena vezave v jeziku funkcij prvega razreda. Pravočasno predstavlja zapis, ki shranjuje funkcijo skupaj z okoljem. Okolje je primerjava vsake proste funkcije z vrednostjo ali povezavo imena, ustvarjenega z zapiranjem javascripta. Omogoča dostop do zajetih spremenljivk, prek kopij vrednosti ali povezav, tudi če se kliče izven območja.

Koncept zaprtij

[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_491. Zaprtje so bile razvite v šestdesetih letih za mehansko vrednotenje izrazov v izračunu in uporabljene leta 1970 kot značilnost programskega jezika PAL za podporo funkcij prvega razreda v leksikalni sferi. Peter Landin je izraz "zaprtje" leta 1964 opredelil z delom okolja in nadzora, ki ga je uporabljal stroj SECD, da bi ovrednotil lambda izraze, povezane z leksičnim okoljem, kar je privedlo do njihovega zaprtja ali zapiranja v javascript.


Takšna razlaga je prišla leta 1975 kot leksično omejena različica LISP in postala široko razširjena. Leksikalno okolje je niz veljavnih spremenljivk v programu. Sestavljen je iz notranjega leksičnega okolja in sklicevanja na zunanje okolje, tako imenovanih nelokalnih spremenljivk. Leksikonske ključavnice v javascript so funkcije s svojim zunanjim okoljem. Kot javascript, imajo vse spremenljivke povezavo do tipa. JS uporabljasamo referenciranje - ki ustreza C ++ 11, in življenjsko dobo navzkrižnih lokalnih spremenljivk, ki jih zajame funkcija, se razširi v času trajanja funkcije.
[palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_422.jpeg

Prvovrstne funkcije

Zaklepanje v javascriptu se običajno pojavlja v jezikih s pomenom prvega razreda. Takšni jeziki omogočajo prenos funkcij kot argumentov. Poleg vračanja iz klicev funkcij in povezovanja z imeni spremenljivk. To se zgodi kot preproste vrste, kot so vrstice in cela števila.


[palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_483 .jpeg [/thumb]
V tem primeru se izraz lambda (lambda (knjiga) (> = prag knjige knjig) prodaja v funkciji najbolje prodajanih knjig. Ko se izračuna lambda izraz, vezje ustvari vezje, ki je sestavljeno iz kode za izražanje lambda in sklica na prag spremenljivke, ki je prosta spremenljivka znotraj lambda izraza. Zaklep nato prenese funkcijo filtriranja, ki jo pokliče večkrat, da ugotovi, katere knjige naj se dodajo na seznam rezultatov in ki jih je treba zavreči. Ker je vrednost praga zaklenjena, jo lahko uporabi vsakič, ko se pokliče njen filter. Funkcijo filtra lahko definirate v popolnoma ločeni datoteki. Tukaj je isti primer, ki je bil ponovno napisan v JS. Pokaže, kako zaklep pod pokrovom deluje v javascriptu.
[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_624.jpeg
Ključna beseda se uporablja namesto globalne funkcije filtra, vendar v drugi strukturi in učinek kode obstajaenako. Funkcija lahko ustvari vezje in ga obrne nazaj, ker v tem primeru gre skozi izvajanje funkcije s spremenljivkami f in dx nadaljuje z delovanjem po izpeljanem, čeprav jih je izvedba pustila v obsegu in niso več vidni.
V jezikih brez ključavnic se življenjska doba avtomatske lokalne spremenljivke ujema z izvajanjem okvira steka, kjer je deklarirana ta spremenljivka. V jezikih z zaklepanjem javascripta in funkcijami iife morajo spremenljivke še naprej obstajati, dokler so obstoječe blokade povezane z njimi. To se najpogosteje izvaja z uporabo neke vrste zbiranja smeti.

Področja uporabe

[palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_525. Prednost ključavnice je v tem, da shranjuje obseg delovanja, "verigo prepoznavnosti" zunanjega ali "nadrejenega" konteksta izvršitve. To vedenje lahko uporabite na več načinov in je postalo uporabno orodje za preprečevanje številnih javascriptov. Eden od najpogostejših je problem "zank". Težava z zanko se pojavi, ko uporabnik ustvari funkcijo v zanki in pričakuje, da bo trenutna vrednost spremenljivke ostala v tej novi funkciji, tudi če se spremeni v kontekstu zanke, preden pokliče novo funkcijo. Na ta način uporabljena vezja nimajo več referenčne preglednosti in zato niso več čiste funkcije, vendar se običajno uporabljajo v nerodnih funkcionalnih jezikih, kot je shema. Da bi razumeli, kakšno zapiranje v javascript, je treba upoštevati primere od njihuporabo Dejansko imajo v praksi veliko aplikacij:
  • Lahko se uporabljajo za opredelitev upravljavskih struktur. Na primer, vse standardne strukture upravljanja Smalltalk, vključno z vejami (če /potem /drugo) in zankami (med in za), se določijo z uporabo objektov, ki so zaklenjeni. Uporabniki lahko tudi enostavno uporabljajo zaklepanje, da določijo nadzorno strukturo. V jezikih, ki uresničujejo namen, lahko ustvarite njegovo večnamensko okolje, ki vam omogoča zaupno komuniciranje in spreminjanje tega okolja. Zaklepanje se uporablja za izvajanje objektnih sistemov.
  • Ustvarjanje zasebnih in javnih metod spremenljivk s predlogami modulov. Ker povratne funkcije podedujejo območje starševske funkcije, so dostopne vsem spremenljivkam in argumentom v tem kontekstu.
  • Uporabno je v primeru, ko funkcija za vsak klic uporablja isti vir, ampak tudi ustvari vir za to. Zaradi te okoliščine je metoda neučinkovita, kar se odpravi le z zapiranjem.
  • Funkcija v javascript

    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost- Ta-pravila_546.jpeg [/thumb]
    Po mnenju MDN (Mozilla Developer Network), "Zapiranja so funkcije z neodvisnimi spremenljivkami, ki" zapomnijo "svoje okolje ustvarjanja." Praviloma, ko se funkcija konča, njene lokalne spremenljivke ne obstajajo več. Če razumete, kako zaklep deluje v javascript, lahko razmislite o več mehanizmih. Prva je formalna logika. Na primer z uporabo funkcije logName, kisprejema eno ime kot parameter in ga registrira. Potem ustvarim zanko za seznam imen, nastavim 1. časovni interval in nato pokličem funkcijo logName v trenutnem imenu.
    V jeziku prvega razreda je mogoče funkcijo manipulirati na enak način kot druge vrste podatkov, kot je int ali string. Samo ta mehanizem omogoča številnim ustvarjanje neverjetnih stvari, na primer dodeli funkcijo spremenljivki za poznejši klic ali jo prenese kot parameter funkcije.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_177.jpeg
    To načelo uporabljajo številni subjekti kot tudi obdelovalci dogodkov DOM. Sprva poslušajte dogodek, nato dodelite funkcijo povratnega klica, ki bo klicana vsakič, ko se dogodek sproži.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_428.jpeg

    Anonimne funkcije

    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_469. jpeg [/thumb]
    Anonimna funkcija je funkcija brez imena. Skoraj vedno novinec programerji srečajo vsak dan brez razumevanja igre s številkami. Na primer, z izvajanjem operacije dodajanja lahko greste skozi spremenljivke, na primer:

  • var x = 3;
  • y = 5;
  • lahko z = x + y.
  • Ali če ne nameravate ponovno obdelati številk: var z = 3 + 5; To so anonimne številke. Za anonimne funkcije jih lahko deklarirate, ko jih uporabite "na letenje" - brez posredovanja spremenljivke. Vzemite na primer funkcijo do prej: do (function () {alert ("Ceci est une fonction anonyme.");}); Poleg tega obstaja alternativna sintaksa oglasa za prijavo funkcije,ki poudarja, da so hkrati funkcije lahko anonimne in se nanašajo na preproste spremenljivke, kar je priročen način za nastavitev funkcije povratnega klica.

    Opredelitev funkcij

    Pravzaprav je isti mehanizem, toda s tega vidika vam bo omogočil, da vidite, kako je zapiranje funkcije znotraj. Kot lahko vidite, ker so funkcije spremenljivke, kot drugi, ni razlogov, zakaj jih je mogoče lokalno določiti. V jeziku ničelnega reda, kot so C, C ++ in Java, so vse funkcije definirane na isti ravni vidnosti v istem razredu ali globalno. Po drugi strani pa v javascript, lokalna funkcija izgine, tako kot druge lokalne spremenljivke, takoj, ko matična funkcija poteče, tako da ni vidna iz drugih funkcij.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_6810.jpeg [/thumb]
    To je pravzaprav težko, a javascript ima način za sledenje vidnosti spremenljivk, pa tudi na dva načina. Dodelitev globalne spremenljivke v javascriptu ima enak mehanizem kot v Java - kompleksnih objektih, nizih, elementih DOM in drugih, ki se prenašajo z referenco, tako da v naslednji kodi: var tab = [51, 42, 69]; lahko tab2 = zavihek Kjer, zavihek in tab2 - dve povezavi na isto tabelo, tehnično, te kazalce upravlja zbiralec smeti. Navedene so tudi funkcije. Spremenljivka globalFn ni več skrita. Naročilo omogoča, da se to izvede, kot je prikazano na primeru problema z zaprtjem javascripta.
    To funkcijo lahko dobite iz lokalnega konteksta, če funkcija izpolnjuje druge lokalne spremenljivke. Enostavnona primer: auto-increment, funkcija, ki vrne celo število, ki se poveča za 1 za vsak klic. Natančneje, potrebna je funkcija inc, ki se obnaša na naslednji način: inc (); //retourne 0 inc (); //retourne 1 inc (); //retourne 2 inc (); //retourne 3 //itd S ključavnico izgleda kot: funkcija makeInc () {var x = 0; return funkcija () {return x ++;}} var inc = makeInc (); V zadnji vrstici v trenutku, ko je spremenljivka inc ustvarjena, nosi nekakšne spremenljivke, ki so okoli, v tem primeru x. Ustvari neviden predmet okoli funkcije, ki vsebuje to spremenljivko. Ta objekt je funkcija zaklepanja javascripta. V tem primeru ima vsaka kopija funkcije svojo lastno zaporo: var inc1 = makeInc (); var inc2 = makeInc (); inc1 (); //0 inc1 (); //1 inc1 (); //2 inc2 (); //0 inc1 (); //3 inc2 (); //1 inc2 (); //2 Kot lahko vidite, je zaprtje v mnogih primerih zelo koristno.

    Konflikti imen spremenljivk

    Da bi se izognili konfliktom imen spremenljivk, se pogosto uporabljajo imenski prostori. V javascriptu imenski prostor predstavlja objekte, podobne drugim.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5412.jpeg
    Seveda A. x in B. x nista ena in ista spremenljivka. Če pa morate samo zagnati skript brez potrebe po shranjevanju spremenljivk za druge, lahko uporabite anonimno funkcijo, kot je vezje. To daje nekoliko čudno sintakso. Čeprav sta dve vrstici kode v sredini precej pogosti, na drugi strani pa se funkcija, ki je v bližini, izvaja na letalu. Bodite pozorni na okrogle oklepaje () na koncu. Da bi lahko napravili vezje, naj bo anonimna funkcija obdana z okroglimi oklepaji. Ta anonimna funkcija uporablja lokalni spremenljivki, odstavek. To je toOdličen način za preprečevanje konfliktov imen ali nerodnosti, pa tudi za napade XSS, so zaščitene uporabniške spremenljivke, nihče jih ne more spremeniti, da bi vplival na vedenje skripta. Obstaja varianta: (function () {//} ()); Hkrati pa bodite pozorni na permutacijo oklepajev. Razlika med tema dvema možnostma je težko razložiti, ker se nanašajo na to, kako kodo bere leksikalni analizator. V obeh primerih se funkcija šteje za izraz, vendar ta izraz ni ovrednoten hkrati. Ne pozabite, da sprejema dva para okroglih oklepajev: enega okoli funkcije in enega za njim.

    javascript programiranje v ciklih

    Ko uporabnik izvaja velike količine programiranja javascripta, mu je težko izogniti se ciklov. Nekdo ga je razjezil, potem pa pridejo do ideje, da ima vsaka implementacija javascripta resno napako. Če razvijalec že ima zanko, ki je ne želi pretvoriti v funkcijo iteratorja, je vse, kar mora storiti, ključavnica, v kateri definira nove spremenljivke. Določajo trenutno vrednost spremenljivk in se spreminjajo na vsaki ponovitvi. Metoda za zajemanje spremenljivk je, da se zunanji tokokrog izvede takoj med trenutno iteracijo cikla. Uporabite lahko enega od teh dveh zglednih pristopov
    . jpeg [/thumb]
    Zdaj obstaja še ena poenostavljena rešitev za to težavo, saj je ključna beseda let podprta v Firefoxu in Chromeu. Je ključna beseda za spremenljivko var vari. Naj dela čudežno, ker je napovedanonovo spremenljivko j, katere vrednost je določena z zaprtjem v ciklu. Vendar se je treba zavedati, da po koncu ene ponovitve cikla ne obstaja, saj je lokalno.

    Loop in function

    Za zanko v javascript se ne pojavi, tako kot zanka za C ali Java. Dejansko izgleda bolj kot PHP. Najpomembnejše znanje o ciklih v JS je, da ne ustvarjajo področja delovanja. JS nima bloka obsega, samo funkcijo glasnosti. To lastnost lahko obravnavamo na naslednjem fragmentu: function foo () {var bar = 1; za (var i = 0; zaklepanje in zaklepanje ni nič drugega kot funkcije znotraj drugih funkcij in se prenaša v kak drug kontekst. To se imenuje zaklepanje, ker se zapira prek lokalnih spremenljivk, to je, so na voljo drugim funkcijam v obsegu Na primer, čas x, definiran kot parameter foo, in var bar = foo

    () se vrnejo 84. Funkcija vračanja foo ima dostop do x.To je pomembno, ker pomaga razvijalcem ustvarjati funkcije znotraj zank glede na spremenljivke cikla. ta odrezek, ki dodeljuje upravljalnik klikov različnim elementom: //je a od 3 elementov DOM var vrednosti = ['foo', 'bar', 'baz'], za (var i = 0 l = elements.length; i praktičen primer zapiranja javascripta Če uporabnik izvede vezje neposredno nad kodo v brskalniku, lahko naleti na težavo, ker lahko povzroči kakršno koli skladenjsko napako, če izvrši kodo neposredno v brskalniku, potem so kvote zelo visoke, da ne bi prevedli procesa zbiranja spletnega paketa Možne rešitve: //main.js funkcija delo (ime) { return funkcija (tema) {console.log (Kaj je $ {topic} v $ {name}); delo ('javascript') ('zaprtje'); Najprej se imenuje funkcija inime argumenta je posredovano. Ta funkcija besedišča tudi vrne funkcijo, ki sprejema tudi argument teme. Ta funkcija registrira izhod in izhod ima dostop do spremenljivke. Območje funkcije Insider ni omejeno na to funkcijo, zato se koncept imenuje Closure, ker ima dostop do tega polja zunanjega parametra. Funkcija vračanja ima dostop do zunanje leksikalne regije ali kontekstov. Ko razvijalec kliče funkcijo, ki jo tudi vrne, so prvotno imenovane spremenljivke vedno na voljo za notranjo funkcijo. Spodaj je primer z naslednjo kodo.
    [palec] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5314.jpeg

    Primer notranje funkcije

    Več podrobnosti o zapiranju javascripta je mogoče opisati v drugem primeru. Zdaj je to okolje izvršitve uničeno, vendar ime parametra še vedno obstaja. Ustvarjeno je novo notranje funkcionalno okolje, ki je anonimna funkcija. Ima dostop do območja zunanjega leksičnega okolja. Tako spremenljivka okolja še vedno obstaja, tako da ima anonimna funkcija dostop do spremenljivke imena v konzoli, na primer, "Kaj je ključavnica v javascriptu." Notranja funkcija anonimne funkcije //main.js factory () {var products = []; za (var i = 0; i Ustvarjanje funkcij na letalu Ustvarite lahko tovarniško funkcijo - funkcijoFactory, ki opravlja svoje naloge. Nastala funkcija iz tovarne funkcij bo zapiranje, ki zapomni ustvarjanje environment.var functionFactory = function (num1) {return function (num2) {return num1 * num2;}} Zgornja funkcija omogoča prenos ene funkcijeFactory number.spominska vrednost num1. Nastala funkcija pomnoži prvotno število 1-kratno vrednost num2, ki se prenese, ko je klic opravljen. lahko mult5 = funkcijaFactory
    ; lahko mult10 = funkcijaFactory
    ; Zgoraj preprosto ustvari funkcije mult5 in mult10. Zdaj se lahko sklicujete na katero koli od teh funkcij tako, da podate novo številko, ki jo želite pomnožiti s 5 ali 10. Sedaj lahko vidite rezultat. & gt; mult5
    15 & gt; mult5
    25 & gt; mult10
    30 & gt; mult10
    50 Lock je ena najmočnejših javascript funkcij, vendar je ni mogoče pravilno uporabljati brez razumevanja bistva. Razmeroma lahko jih je po naključju ustvariti, zato se zakrijejo nevarni javascript. Njihovo ustvarjanje ima potencialno škodljive učinke, zlasti v nekaterih običajnih okoljih spletnega brskalnika. Da bi se izognili nenamernim trkom z slabimi stranmi in izkoristili prednosti, ki jih ponujajo, je treba razumeti njihov mehanizem.

    Sorodne publikacije