Zaključaj u JavaScriptu: praktični primjer, značajke i pravila

U programiranju zatvaranja ili u engleskoj verziji "zatvaranja" - metoda implementacije kontekstnog naziva vezanja u jeziku funkcija prvog razreda. On odmah predstavlja zapis koji pohranjuje funkciju zajedno s okolinom. Okruženje je usporedba svake slobodne funkcije s vrijednošću ili vezom imena stvorenog zatvaranjem u javascript. Omogućuje pristup zarobljenim varijablama, putem kopija vrijednosti ili veza, čak i kada se poziva izvan tog područja.

Koncept zatvaranja

[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_491. Zatvaranje je razvijeno šezdesetih godina prošlog stoljeća za mehaničku procjenu izraza u proračunu i primijenjeno 1970. godine kao obilježje PAL programskog jezika za potporu funkcijama prve klase u leksičkoj sferi. Peter Landin je definirao pojam "zatvaranje" 1964. godine s dijelom za okoliš i kontrolu koji se koristi na stroju SECD za procjenu lambda izraza povezanih s leksičkim okruženjem, što je dovelo do njihovog zatvaranja ili zatvaranja u javascript.


Takvo objašnjenje došlo je 1975. kao leksički ograničena verzija LISP-a i postalo je rašireno. Leksičko okruženje je skup važećih varijabli u programu. Sastoji se od unutarnjeg leksičkog okruženja i upućivanja na vanjsko okruženje, tzv. Nelokalnih varijabli. Leksikonske brave u javascriptu su funkcije s vanjskim okruženjem. Kao i javascript, sve varijable imaju vezu na taj tip. JS koristisamo referenciranje - koje odgovara C ++ 11, i vijek trajanja unakrsnih lokalnih varijabli koje hvata funkcija, proteže se tijekom trajanja funkcije.
[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_422.jpeg

Prvorazredne funkcije

Zaključavanja u javascriptu obično se pojavljuju u jezicima s prvoklasnim značenjem. Takvi jezici omogućuju prijenos funkcija kao argumenata. Kao i povratak iz poziva funkcija i povezivanje s imenima varijabli. To se događa poput jednostavnih tipova, kao što su redovi i cijeli brojevi.


http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_483 .jpeg [/thumb]
U ovom primjeru izraz lambda (lambda (knjiga) (> = prag knjige knjige prodaje) pojavljuje se unutar funkcije najprodavanijih knjiga. Kada se izračuna lambda izraz, sklop stvara krug koji se sastoji od koda za izražavanje lambda i reference na prag varijable, koji je slobodna varijabla unutar lambda izraza. Zaključavanje zatim prolazi kroz funkciju filtriranja koja je poziva više puta kako bi odredila koje knjige treba dodati na popis rezultata i koje treba odbaciti. Budući da postoji zaključavanje vrijednosti praga, potonji ga može koristiti svaki put kad se pozove njegov filtar. Sama funkcija filtriranja može se definirati u potpuno zasebnoj datoteci. Ovdje je isti primjer, prepisano u JS. On pokazuje kako zaključava ispod haube u JavaScriptu.
[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_624.jpeg
Ključna riječ ovdje se koristi umjesto globalne funkcije filtriranja, ali u drugoj strukturi i efekt koda postojiisto. Funkcija može stvoriti sklop i okrenuti ga natrag, jer u ovom slučaju prolazi kroz izvršavanje funkcije s f varijabama i dx nastavlja funkcionirati nakon izvedenice, čak i ako ih je izvršenje ostavilo u opsegu i više nisu vidljivi.
U jezicima bez brave, vijek trajanja automatske lokalne varijable odgovara izvršenju okvira stogova gdje je ova varijabla deklarirana. U jezicima s JavaScript zatvaranjem i iife funkcijama, varijable moraju i dalje postojati sve dok postojeće blokiranje ima veze s njima. To se najčešće provodi pomoću nekog oblika skupljanja smeća.

Područja primjene

[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_525. jpeg [/thumb]
Prednost brava je u tome što pohranjuje opseg djelovanja, "lanac vidljivosti" vanjskog ili "roditeljskog" konteksta izvršenja. Takvo se ponašanje može koristiti na nekoliko načina i postalo je koristan alat za sprječavanje brojnih JavaScript pogrešaka. Jedan od najčešćih je problem "petlje". Problem petlje se pojavljuje kada korisnik kreira funkciju u petlji i očekuje da trenutna vrijednost varijable ostane u toj novoj funkciji, čak i ako se promijeni u kontekstu petlji prije pozivanja nove funkcije. Krugovi koji se koriste na ovaj način više nemaju referentnu transparentnost i stoga više nisu čiste funkcije, ali se obično koriste u gadnim funkcionalnim jezicima, kao što je shema. Da bi se razumjelo kakvo je zatvaranje u javascript, potrebno je razmotriti njihove slučajevekorištenje. Zapravo, u praksi imaju mnogo primjena:
  • Mogu se koristiti za definiranje upravljačkih struktura. Na primjer, sve standardne strukture upravljanja Smalltalk, uključujući grane (ako /onda /drugo) i petlje (za vrijeme i za), određuju se pomoću objekata koji su zaključani. Korisnici također mogu lako koristiti zaključavanje kako bi odredili upravljačku strukturu. U jezicima koji provode svrhu, možete stvoriti njegovu multifunkcionalnu okolinu, omogućujući vam da komunicirate povjerljivo i promijenite ovo okruženje. Zaključavanje se koristi za implementaciju objektnih sustava.
  • Stvaranje privatnih i javnih metoda varijabli pomoću predložaka modula. Budući da povratne funkcije nasljeđuju područje roditeljske funkcije, dostupne su svim varijablama i argumentima u ovom kontekstu.
  • Korisno je u situaciji u kojoj funkcija koristi isti resurs za svaki poziv, ali i sam stvara za njega. Ta okolnost čini metodu nedjelotvornom, što se eliminira samo zatvaranjem.
  • Funkcija u javascript

    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost- Ta-pravila_546.jpeg
    Prema MDN-u (Mozilla Developer Network), "Zatvaranje su funkcije s nezavisnim varijablama koje" pamte "svoje okruženje stvaranja." I, u pravilu, kada se funkcija završi, njene lokalne varijable više ne postoje. Razumijevanje kako zaključavanje funkcionira u javascriptu, možete razmotriti nekoliko mehanizama. Prvi je formalna logika. Primjerice, pomoću funkcije logName kojaprihvaća jedno ime kao parametar i registrira ga. Zatim kreiram petlju za popis imena, postavljam prvi time-out, a zatim pozivam funkciju logName u trenutnom imenu.
    U jeziku prve klase, funkcijom se može manipulirati na isti način kao i drugi tipovi podataka, kao što je int ili string. Samo ovaj mehanizam omogućuje mnogima stvaranje nevjerojatnih stvari, primjerice, dodijeliti funkciju varijabli za njezin sljedeći poziv ili je proslijediti kao parametar funkcije.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_177.jpeg
    Ovaj princip koriste mnogi entiteti, kao i DOM događanja. Prvo poslušajte događaj, a zatim dodijelite funkciju povratnog poziva koja će se zvati svaki put kada se događaj pokrene.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_428.jpeg

    Anonimne funkcije

    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_469. jpeg [/thumb]
    Anonimna funkcija je funkcija bez imena. Gotovo novajliji programeri susreću ih svaki dan bez razumijevanja igre s brojevima. Na primjer, izvođenjem operacije dodavanja, možete proći kroz varijable, na primjer:

  • var x = 3;
  • y = 5;
  • može z = x + y.
  • Ili ako ne namjeravate ponovno obraditi brojeve: var z = 3 + 5; Ovo su anonimni brojevi. Za anonimne funkcije možete ih deklarirati kada se koriste "u hodu" - bez prosljeđivanja varijable. Primjerice, uzmite funkciju s ranije: do (function () {alert ("Ceci est une fonction anonyme.");}); Štoviše, postoji alternativna sintaksa oglasa za deklariranje funkcije,u kojoj se ističe da su obje funkcije mogu biti anonimni i oslanjaju se na jednostavne varijable koje su zgodan način za instaliranje povratni poziv funkcije.

    Definicija funkcije

    To je zapravo isti mehanizam, ali po tom pitanju on će vidjeti kako funkcionira krug unutar. Očito, jer su funkcije varijable, poput drugih, nema razloga da bi ih prepoznati na lokalnoj razini. U nultog reda jezika na, kao što su C, C ++ i Java, sve funkcije su definirane na istoj razini vidljivosti, u istoj klasi ili globalno. S druge strane, lokalni javascript funkcija nestaje, kao i drugih lokalnih varijabli, čim roditelj funkcija završava, tako da se ne vidi od drugih funkcija.
    [palac] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_6810.jpeg [/palac]
    To je jako teško, ali javaScript je način za praćenje vidljivost varijabli, pa čak i na dva načina. Imenovanje globalna varijabla u JavaScriptu s istim mehanizmom kao u Java - složenih objekata, polja, DOM i drugih predmeta donosi se, kad je u sljedećem broj: kartici var = [51, 42, 69]; var tab2-kartica. Gdje, kartica i tab2 - dvije reference na istim stolom upućuje tehnički upravlja đubretar. Funkcije se također prenose preko veze. Varijabilni globalFn više nije skriveno. Postupak omogućuje da se to pokazao problema na JavaScript kruga.
    [palac] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_9511.jpeg [/palac]
    Evo kako da biste dobili funkciju lokalnog konteksta, ako je funkcija zadovoljava druge lokalne varijable. lakoprimjer: auto-prirast, funkcija koja vraća cijeli broj koji se povećava za 1 za svaki poziv. Konkretno, potrebna je funkcija inc, koja se ponaša kako slijedi: inc (); //retourne 0 inc (); //retourne 1 inc (); //retourne 2 inc (); //retourne 3 //itd S bravom izgleda kao: funkcija makeInc () {var x = 0; return funkcija () {return x ++;}} var inc = makeInc (); U zadnjem retku u trenutku kada je varijabla inc stvorena, ona nosi neku vrstu varijabli koje se nalaze oko, u ovom slučaju x. On stvara nevidljivi objekt oko funkcije koja sadrži ovu varijablu. Ovaj objekt je funkcija zatvaranja javascripta. U ovom slučaju, svaka kopija funkcije će imati svoje vlastito zatvaranje: var inc1 = makeInc (); var inc2 = makeInc (); inc1 (); //0 inc1 (); //1 inc1 (); //2 inc2 (); //0 inc1 (); //3 inc2 (); //1 inc2 (); //2 Kao što možete vidjeti, zatvaranje je vrlo korisno u mnogim slučajevima.

    Sukobi imena varijabli

    Kako bi se izbjegli sukobi naziva varijabli, uobičajeno se koriste prostori imena. U javascriptu, imenski prostor predstavlja objekte slične drugima.
    http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5412.jpeg
    Naravno, A. x i B. x nisu jedna te ista varijabla. Međutim, ako trebate pokrenuti skriptu bez potrebe za pohranjivanjem varijabli za druge, možete koristiti anonimnu funkciju kao krug. To daje pomalo čudnu sintaksu. Iako su dvije linije koda u sredini vrlo uobičajene, s druge strane, funkcija koja se nalazi u okolini izvodi se u letu. Obratite pozornost na okrugle zagrade () na kraju. A kako bi mogli napraviti krug, sama anonimna funkcija trebala bi biti okružena okruglim zagradama. Ova anonimna funkcija koristi lokalnu varijablu, odlomak. To je toSjajan način da se spriječe konflikti imena ili nespretnost, ali i protiv XSS napada, korisničke varijable su zaštićene, nitko ih ne može promijeniti da bi utjecale na ponašanje skripte. Postoji varijanta: (function () {//} ()); Istodobno obratite pozornost na permutaciju zagrada. Teško je objasniti razliku između ove dvije opcije, jer se odnose na način čitanja koda od strane leksičkog analizatora. U oba slučaja, funkcija se smatra izrazom, ali taj izraz nije procijenjen u isto vrijeme. Samo zapamtite da prihvaća dva para okruglih zagrada: jedan oko funkcije i jedan iza njega.

    javascript programiranje u ciklusima

    Kada korisnik izvrši velike količine programiranja javascripta, teško mu je izbjeći cikluse. Netko ga baca, nakon čega dolaze do ideje da svaka implementacija javascripta ima ozbiljnu pogrešku. Ako programer već ima petlju koju ne želi pretvoriti u funkciju iteratora, sve što treba učiniti je zaključavanje u kojem definira nove varijable. Oni popravljaju trenutnu vrijednost varijabli i mijenjaju se za svaku iteraciju. Metoda za hvatanje varijabli je da se vanjski krug izvršava odmah tijekom trenutne iteracije ciklusa. Možete koristiti jedan od ova dva primjerna pristupa
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_7913. jpeg [/thumb]
    Sada postoji još jedno pojednostavljeno rješenje ovog problema, budući da je ključna riječ let podržana u Firefoxu i Chromeu. To je ključna riječ za var varijabilni blok. Neka djeluje magično, jer je najavljenonova varijabla j, čija je vrijednost fiksirana zatvaranjem unutar ciklusa. Međutim, treba imati na umu da ne nastavlja postojati nakon završetka jedne iteracije ciklusa, jer je lokalno.

    Petlja i funkcija

    Za petlju u javascriptu ne pojavljuje se, baš kao i petlja za C ili Java. Zapravo, izgleda više kao PHP. Najvažnije znanje o ciklusima u JS-u je da oni ne stvaraju područje djelovanja. JS nema blok opsega, samo funkciju glasnoće. Ovo svojstvo može se razmatrati na sljedećem fragmentu: function foo () {var bar = 1; za (var i = 0; zaključavanje i zaključavanje zaključavanja nije ništa drugo nego funkcija unutar drugih funkcija i prenosi se u neki drugi kontekst. To se naziva zaključavanje jer se zatvara preko lokalnih varijabli, tj. dostupne su drugim funkcijama u opsegu Na primjer, vrijeme x definirano kao parametar foo i var bar = foo

    () vratit će se 84. Funkcija povratka foo ima pristup x.To je važno jer pomaže programerima u stvaranju funkcija unutar petlji ovisno o varijablama ciklusa. ovaj isječak koji dodjeljuje rukovatelje klikova različitim elementima: //je a od 3 DOM elementa var vrijednosti = ['foo', 'bar', 'baz'], za (var i = 0 l = elements.length; i Praktičan primjer zatvaranja javascripta Ako korisnik izvrši krug izravno iznad koda u pregledniku, može se pojaviti u problemu jer može napraviti bilo koju sintaktičku pogrešku.Ako izvršava kôd izravno u pregledniku, onda su izgledi vrlo visoki kako se ne bi preveo proces kompilacije webpack-a Moguća rješenja: return funkcija (topic) {console.log (Što je $ {topic} u $ {name}); }} rad ('javascript') ('Zatvaranje'); Prvo, funkcija se zove iproslijeđen je naziv argumenta. Ova funkcija vokabulara također vraća funkciju koja također prihvaća argument teme. Ova funkcija registrira izlaz, a izlaz ima pristup varijabli. Područje ima Insider nije ograničena samo na ove osobine, jer koncept se zove zatvaranje, jer ima pristup ovom području vanjskog parametra. Funkcija vraćanja ima pristup vanjskoj leksičkoj regiji ili kontekstima. Kada programer pozove funkciju koja ga također vraća, izvorno imenovane varijable uvijek su dostupne za unutarnju funkciju. Slijedi primjer sa sljedećim kodom.
    [palac] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5314.jpeg [/palac]

    primjer unutarnjih funkcija

    na više zatvarača JavaScript za reći drugi primjer. Sada je ovo okruženje izvršenja uništeno, ali ime parametra još uvijek postoji. Stvara se novo unutarnje funkcionalno okruženje koje je anonimna funkcija. Ima pristup području vanjske leksičke okoline. Dakle, varijabla okruženja još uvijek postoji, tako da anonimna funkcija ima pristup ime varijable tiskane u konzoli, kao što su: „Što je krug u javascript». Unutarnja anonimna funkcija //main.js funkcija tvornica () {var products = []; za (var i = 0;. i. Stvaranje funkcije „u letu” može stvoriti tvorničke funkcije - functionFactory, koji obavlja svoje vlastite probleme Dobivena funkcija zatvaranja tvornica će funkciju koja pamti okoliša stvaranje var functionFactory = funkcija (num1) {povratak funkcija (num2) {povrat num1 num2 *;}}. gornji može prenijeti broj functionFactory zatim vraćeni functionFactory,memorijska vrijednost num1. Rezultirajuća funkcija množi izvorne num1 puta num2 vrijednost koja je prošla kada je napravio poziv. može mult5 = funkcijaFactory
    ; može biti mult10 = funkcijaFactory
    ; Navedeno jednostavno stvara funkcije mult5 i mult10. Sada se možete pozvati na bilo koju od ovih funkcija tako što ćete poslati novi broj koji želite pomnožiti s 5 ili 10. Sada možete vidjeti rezultat. & gt; mult5
    15 & gt; mult5
    25 & gt; mult10
    30 & gt; mult10
    50 Lock je jedan od najmoćnijih javascript funkcija, ali se ne može ispravno koristiti bez razumijevanja bitnosti. Relativno ih je lako stvoriti slučajno, zbog čega se opasni JavaScript zatvara. Njihovo stvaranje ima potencijalno štetne učinke, osobito u nekim uobičajenim okruženjima web-preglednika. Kako bi se izbjegli slučajni sudari s nedostacima i iskoristili prednosti koje nude, potrebno je razumjeti njihov mehanizam.

    Povezane publikacije