Заключване на JavaScript: практически пример, функции и правила

В програмирането на затварянето или в английската версия на "затварянето" - метод за прилагане на контекстното име на свързването в езика на функциите на първия клас. Той незабавно представлява запис, който съхранява функцията заедно с околната среда. Средата е сравнение на всяка свободна функция със стойността или връзката на името, създадено чрез затваряне в javascript. Тя позволява достъп до заловени променливи, чрез копия на ценности или връзки, дори когато се извиква извън зоната.

Концепция за затваряне

[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_491. Закриването е разработено през 60-те години за механична оценка на изразите в изчисленията и е приложено през 1970 г. като характеристика на програмния език PAL, за да се подкрепят функциите на първия клас в лексикалната сфера. Питър Ландин дефинира термина "затваряне" през 1964 г. с частта за околната среда и контрола, използвана на машината SECD, за да оцени ламбда изразите, свързани с лексикалната среда, което доведе до тяхното затваряне или затваряне в javascript.


Такова обяснение дойде през 1975 г. като лексикално ограничена версия на LISP и стана широко разпространено. Лексичната среда е набор от валидни променливи в програмата. Тя се състои от вътрешна лексикална среда и препратки към външната среда, т.нар. Нелокални променливи. Лексиковите ключалки в javascript са функции със своята външна среда. Подобно на javascript, всички променливи имат връзка към типа. JS използвасамо реферирането - което съответства на C ++ 11, и времето на живот на кръстосаните локални променливи, уловени от функцията, се простира по време на живота на функцията.
[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_422.jpeg

Първокласни функции

Закъсненията в javascript обикновено се появяват на езици с първокласни значения. Тези езици позволяват прехвърлянето на функции като аргументи. Както и връщане от повиквания на функции и свързване към имена на променливи. Това се случва просто като прости типове, като редове и цели числа.


[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_483 .jpeg
В този пример изразът lambda (lambda (book) (> = праг на книгата за продажби) се появява във функцията за най-продаваните книги. Когато се изчислява ламбда-израз, веригата създава верига, която се състои от код за изразяване на ламбда и позоваване на прага на променлива, която е свободна променлива в рамките на ламбда-израза. След това заключването преминава функцията на филтъра, която я извиква многократно, за да определи кои книги трябва да бъдат добавени към списъка с резултати и кои трябва да бъдат отхвърлени. Тъй като стойността на прага е заключена, последната може да я използва всеки път, когато се нарича филтър. Самата функция на филтъра може да бъде дефинирана в напълно отделен файл. Ето един и същ пример, пренаписан в JS. Той показва как заключва под капака в JavaScript работи.
[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_624.jpeg
Ключовата дума тук се използва вместо глобалната филтърна функция, но в друга структура и ефектът на кода там есъщото. Функцията може да създаде верига и да я върне обратно, защото в този случай тя преминава през изпълнението на функцията с променливите f и dx продължава да функционира след производната, дори ако изпълнението ги остави в обхвата и вече не са видими.
В езиците без заключване, продължителността на живота на автоматичната локална променлива съответства на изпълнението на рамката на стека, в която е декларирана тази променлива. В езиците с javascript затваряния и iife функции, променливите трябва да продължат да съществуват, докато съществуващите блокирания имат връзки към тях. Това най-често се осъществява чрез използване на някаква форма на събиране на боклука.

Области на приложение

[thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_525. Предимството на ключалката е, че то съхранява обхвата на действие, "веригата за видимост" на външния или "родителския" контекст на изпълнение. Това поведение може да се използва по няколко начина и е станало полезен инструмент за предотвратяване на редица грешки в JavaScript. Един от най-често срещаните е проблемът с "примките". Проблем с цикъла възниква, когато потребителят създава функция в цикъл и очаква текущата стойност на променливата да остане в тази нова функция, дори ако тя се промени в контекста на циклите, преди да извика новата функция. Използваните по този начин схеми вече нямат референтна прозрачност и следователно вече не са чисти функции, но обикновено се използват в гадни функционални езици, като схема. За да се разбере какъв вид затваряне в javascript, е необходимо да се разгледат случаи от тяхизползвате. Всъщност на практика те имат много приложения:
  • Те могат да бъдат използвани за определяне на управленски структури. Например, всички стандартни структури за управление на Smalltalk, включително клонове (ако /след това /друго) и цикли (докато и за), се определят чрез обекти, които са заключени. Потребителите също така могат лесно да използват заключването, за да определят структурата на управление. В езиците, които изпълняват целта, можете да създадете мултифункционална среда, която ви позволява да общувате конфиденциално и да променяте тази среда. Заключването се използва за изпълнение на обектни системи.
  • Създаване както на частни, така и на публични методи на променливи с помощта на модулни шаблони. Тъй като функциите за връщане наследяват областта на родителската функция, те са достъпни за всички променливи и аргументи в този контекст.
  • Той е полезен в ситуация, в която дадена функция използва един и същ ресурс за всяко повикване, но също така създава и самия ресурс за него. Това обстоятелство прави метода неефективен, което се елиминира само чрез затваряне.
  • Функция в javascript

    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost- Според MDN (Mozilla Developer Network), "Затваряне са функции с независими променливи, които" помнят "създаването им среда." И като правило, когато функцията приключи, нейните локални променливи вече не съществуват. Разбирайки как заключването работи в javascript, можете да разгледате няколко механизма. Първата е формална логика. Например, използвайки функцията logName коятоприема едно име като параметър и го регистрира. След това създавам for loop, за да изброя имената, да настроя 1-вото време за изчакване и след това да извикам logName функцията в текущото име.
    В езика от първа класа, функцията може да се манипулира по същия начин, както други видове данни, като int или string. Само този механизъм позволява на мнозина да създават невероятни неща, например да зададат функция на променлива за следващото й повикване или да я прехвърлят като параметър на функцията.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_177.jpeg
    Този принцип се използва от много обекти, както и от DOM обработчици на събития. Първоначално прослушайте събитието, след което назначете функция за обратно извикване, която ще бъде извиквана всеки път, когато събитието се задейства.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_428.jpeg

    Анонимни функции

    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_469. jpeg [/thumb]
    Анонимната функция е функция без име. Почти начинаещите програмисти се срещат с тях всеки ден, без да разбират играта с числа. Например, чрез извършване на операция по добавяне, можете да преминете през променливи, например:

  • var x = 3;
  • y = 5;
  • може да z = x + y.
  • Или ако не възнамерявате да преработвате числата: var z = 3 + 5; Това са анонимни номера. За анонимни функции можете да ги декларирате, когато се използват "в движение" - без да предавате променливата. Например, приемете функцията „по-рано“: do (function () {alert ("Ceci est une fonction anonyme.");}); Освен това има алтернативен синтаксис за обявяване на функция,което подчертава, че едновременно функциите могат да бъдат анонимни и да се отнасят до прости променливи, което е удобен начин за създаване на функция за обратно извикване.

    Дефиниция на функции

    В действителност, това е същият механизъм, но от тази гледна точка, той ще ви позволи да видите как затварянето на функцията вътре. Както можете да видите, тъй като функциите са променливи, както и другите, няма причини да се определят локално. В език с нулев ред като C, C ++ и Java, всички функции се дефинират на същото ниво на видимост, в един и същи клас или глобално. От друга страна, в javascript, локалната функция изчезва, както и другите локални променливи, веднага след изтичане на родителската функция, така че не се вижда от други функции.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_6810.jpeg [/thumb]
    Това всъщност е трудно, но javascript има начин да проследява видимостта на променливите, както и по два начина. Присвояването на глобална променлива в javascript има същия механизъм като в Java - сложни обекти, масиви, DOM елементи и други се предават по референция, така че в следния код: var tab = [51, 42, 69]; може tab2 = tab Къде, раздела и таб2 - две връзки към една и съща таблица, технически тези указатели се управляват от боклука. Функциите също са посочени. Променливата globalFn вече не е скрита. Поръчката позволява това да бъде направено, както е показано на примера на проблема със затварянето на javascript.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_9511.jpeg
    Ето как можете да получите функция от локалния контекст, ако функцията отговаря на други локални променливи. лесноНапример: auto-increment, функция, която връща цяло число, което се увеличава с 1 за всяко повикване. По-конкретно се изисква функцията inc, която се държи по следния начин: inc (); //retourne 0 inc (); //retourne 1 inc (); //retourne 2 inc (); //retourne 3 //и т.н. При заключване изглежда така: function makeInc () {var x = 0; return function () {return x ++;}} var inc = makeInc (); В последния ред в момента, в който е създадена променливата inc, той носи някакъв вид променливи, които са около, в този случай x. Той създава невидим обект около функция, която съдържа тази променлива. Този обект е функция на затваряне на javascript. В този случай всяко копие на функцията ще има собствено затваряне: var inc1 = makeInc (); var inc2 = makeInc (); inc1 (); //0 inc1 (); //1 inc1 (); //2 inc2 (); //0 inc1 (); //3 inc2 (); //1 inc2 (); //2 Както виждате, затварянето е много полезно в много случаи.

    Конфликти на имена на променливи

    За да се избегнат конфликти на имена на променливи, често се използват пространства от имена. В javascript, пространството от имена представлява обекти, подобни на други.
    [палец] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5412.jpeg
    Естествено, A. x и B. x не са една и съща променлива. Въпреки това, ако просто трябва да стартирате скрипт, без да се изисква съхранение на променливи за други, можете да използвате анонимна функция като верига. Това дава малко странен синтаксис. Въпреки че две линии от кода в средата са доста често срещани, от друга страна, функцията, която се намира, се изпълнява в движение. Обърнете внимание на кръглите скоби () в края. И за да може да се направи верига, анонимната функция трябва да бъде заобиколена от кръгли скоби. Тази анонимна функция използва локална променлива, абзац. Това е всичкоЧудесен начин за предотвратяване на конфликти на имена или неловкост, но също и срещу XSS атаки, потребителски променливи са защитени, никой не може да ги промени, за да повлияе на поведението на скрипта. Има вариант: (function () {//} ()); В същото време обърнете внимание на пермутацията на скобите. Разликата между тези две възможности е трудно да се обясни, тъй като те се отнасят до това как кодът се чете от лексикален анализатор. И в двата случая функцията се счита за израз, но този израз не се оценява едновременно. Само не забравяйте, че той приема две двойки кръгли скоби: една около функцията и една зад нея.

    Програмиране на javascript в цикли

    Когато потребителят изпълнява големи обеми програмиране на javascript, за него е трудно да избегне цикли. Някой я хвърля на лудост, след което стига до идеята, че всяка реализация на javascript има сериозна грешка. Ако разработчик вече има контур, който не иска да преобразува, за да използва итераторната функция, всичко, което той трябва да направи, е ключалката, в която определя нови променливи. Те фиксират текущата стойност на променливите и се променят за всяка итерация. Методът за улавяне на променливи е, че външната верига се изпълнява незабавно по време на текущата итерация на цикъла. Можете да използвате един от тези два примерни подхода
    . jpeg
    Сега има още едно опростено решение на този проблем, тъй като ключовата дума "нека" се поддържа и в Firefox, и в Chrome. Това е ключова дума за вариабилен блок var. Нека работи магически, защото е обявенонова променлива j, чиято стойност е фиксирана от затварянето в рамките на цикъла. Трябва да се има предвид обаче, че то не продължава да съществува след края на една итерация на цикъла, защото е локално.

    Цикъл и функция

    За цикъла в javascript не се появява, точно като цикъла за C или Java. Всъщност тя прилича повече на PHP. Най-важното знание за циклите в JS е, че те не създават област на действие. JS няма блок от обхват, само функция за обем. Това свойство може да се разглежда на следния фрагмент: function foo () {var bar = 1; за (var i = 0; заключване и заключване на агрегацията не е нищо друго, освен функции вътре в други функции и се предава в някакъв друг контекст. Това се нарича заключване, защото се затваря чрез локални променливи, т.е., са достъпни за други функции в обхвата Например, времето x, определено като параметър foo и var bar = foo

    () ще върне 84. Функцията за връщане foo има достъп до x.Това е важно, защото помага на разработчиците да създават функции в рамките на контурите в зависимост от променливите на цикъла. този фрагмент, който присвоява манипулатор за кликвания на различни елементи: //елементи е a от 3 елемента DOM var стойности = ['foo', 'bar', 'baz'], за (var i = 0 l = elements.length; i практически пример за затваряне на javascript Ако потребителят изпълни верига директно над кода в браузъра, може да се сблъска с проблем, защото може да направи всяка синтактична грешка.Ако изпълнява кода директно в браузъра, тогава коефициентите са много високи, за да не се компилира процесът на компилиране на уеб пакета Възможни решения: //main.js функция work (име) { return функция (тема) {console.log (Какво е $ {topic} в $ {name}); }} работа ('javascript') ('Закриване'); Първо, функцията се нарича иимето на аргумента е подадено. Сега тази функция на речника също връща функция, която също приема аргумента на темата. Тази функция регистрира изхода и изходът има достъп до променливата. Областта на функцията Insider не е ограничена до тази функция, така че концепцията се нарича Closure, тъй като има достъп до това поле на външен параметър. Функцията за връщане има достъп до външен лексикален регион или контекст. Когато разработчик извика функция, която също го връща, първоначално назованите променливи са винаги достъпни за вътрешната функция. Следното е пример със следния код.
    [thumb] http://hi-news.pp.ua/uploads/posts/2018-11/zamikannya-v-javascript-praktichniy-priklad-osoblivost-ta-pravila_5314.jpeg

    Пример за вътрешна функция

    Повече подробности за затварянето на javascript могат да бъдат описани във втория пример. Сега тази среда на изпълнение е унищожена, но името на параметъра все още съществува. Създава се нова вътрешна функционална среда, която е анонимна функция. Тя има достъп до зоната на външната лексикална среда. По този начин променливата на обкръжението все още съществува, така че анонимната функция има достъп до променливата на името в конзолата, например "Какво е заключване в javascript". Вътрешна анонимна функция //main.js функция factory () {var products = []; за (var i = 0; i Създаване на функции в движение Можете да създадете фабрична функция - functionFactory, която изпълнява своите задачи. Получената функция от фабриката на функциите ще бъде затваряне, което запаметява създаването environment.var functionFactory = function (num1) {return функция (num2) {return num1 * num2;}} Горната функция позволява прехвърлянето на една функцияFactory number.стойност на паметта num1. Получената функция умножава първоначалния num1 пъти стойността на num2, която се предава при осъществяване на повикване. може да mult5 = functionFactory
    ; може да mult10 = функцияFactory
    ; Горното просто създава функциите mult5 и mult10. Сега можете да се обърнете към някоя от тези функции, като предавате нов номер, който искате да умножите по 5 или 10. Сега можете да видите резултата. & gt; mult5
    15 & gt; mult5
    25 & gt; mult10
    30 & gt; mult10
    50 Lock е една от най-мощните функции на javascript, но не може да се използва правилно без разбиране на същността. Сравнително лесно се създават случайно, затова опасните скриптове на JavaScript. Създаването им има потенциално вредни ефекти, особено в някои общи среди на уеб браузъра. За да се избегнат случайни сблъсъци с недостатъци и да се използват предимствата, които те предлагат, е необходимо да се разбере техният механизъм.

    Свързани публикации