JavaScript затваряне – closures

JavaScript променливи могат да принадлежат към локален или глобален обхват. Някои променливи могат да бъдат направени локални с помощта на closures.

Глобални променливи

В дадена функция може да получите достъп до всички променливи, които са дефинирани вътре в самата функция.

Опитайте сами »

Но една функция може да достъпи променливи, които са дефинирани и извън самата нея:

Опитайте сами »

В последния пример а е глобална променлива. В една уеб страница глобалните променливи принадлежат към обекта window. Глобалните променливи могат да се използват (и променят) от всички скриптове в страницата (и в прозореца). В първия пример, а е локална променлива. Дадена локална променлива може да се използва само в рамките на функцията, в която е дефинирана. Тя е „скрита“ от останалата част на скрипта. Глобалните и локалните променливи, които имат едно и също име в действителност са различни променливи. Промяната на едната не променя другата (със същото име).
Бележка: Променливи, които са създадени без ключовата дума var винаги са глобални, дори ако те се създават вътре във функция.

Живот на променливите

Глобалните променливи „живеят“ толкова дълго, колкото и самото приложение (прозорец/уеб страница). Локалните променливи имат кратък живот. Те се създават, когато функцията е „извикана“ и се заличават, когато функцията е завършена.

Дилемата с брояча

Да предположим, че искате да използвате променлива за преброяване на нещо, и искате този брояч да бъде на разположение на всички функции. Можете да използвате глобална променлива и функция за увеличаване на брояча. Да разгледаме следващият пример:

Опитайте сами »

Променливата counter трябва да се сменя само от функцията add() (функцията за добавяне на единица). Проблемът е, че който и да е скрипт на страницата може да промени променливата counter, без да се извиква add(). Ако променливата counter бъде декларирана в самата функция, никой няма да бъде в състояние да я промени без да се извика add():

Опитайте сами »

Това не работи! Всеки път, когато извикате функцията add() променливата counter става със стойност 1. Една вложена функция може да реши този проблем. Да разгледаме в следващата част от урока тези особени вложени функции.

Вложени функции

Всички функции имат достъп до глобалният обхват. В действителност, в JavaScript, всички функции имат достъп до обхватът „над“ тях. JavaScript поддържа вложени функции. Вложените функции имат достъп до обхватът „над“ тях. В този пример, вътрешната функция plus() има достъп до променливата counter, която се намира в родителската функция:

Опитайте сами »

Това би могло да реши дилемата дали бихме могли да достъпим до функция plus() от външната й страна. Също така трябва да се намери начин, по който да се изпълни counter = 0 само веднъж. Имаме нужда от closure (закриване).

JavaScript затваряне

Помните ли само-извикващите функции? Какво прави тази функция ли?

Опитайте сами »

На променливата add й се задава стойност, която се връща от само-извикващата функция. Тази функцията се активира само веднъж. Тя задава стойност 0 на променливата counter и се връща израз функция. По този начин променливата add се превръща във функция. Чудното в случаят е, че тя получава достъп до променливата counter в обхвата на родителската функция (самоизвикващата се функция). Това се нарича JavaScript closure. Това дава възможност на дадена функция да има собствени променливи. Променливата counter е защитена от обхвата на анонимната функция, и може да бъде променена само с помощта на функцията add().
Бележка: closure е функция, имаща достъп до родителският обхват, дори след като родителската функция е затворена.

Вижте още