Java сияқты тілдері жекеше әдістерін жариялауға мүмкіндік береді. Бұл кезде тек сол класстағы басқа әдістер оларды тудыруы мүмкін, ал олар сыртында қол жетімді емес.
JavaScript мұндай тікелей жасау мүмкін болмайды, бірақ мұндай сипаттауды тұйықталу арқылы эмулирлеуге болады. Кодқа қол жеткізуді шектеу үшін, кейбір әдістердің жекешелеу мағынасын жасау керек емес. Бұл өзінің дербес жаһандық атаулар кеңістігінің жалпы кеңістіктігін бітемеу үшін құрылатын жақсы амал, яғни жалпы кеңістікте жекешелеу мүлдем қажет емес.
Міне, жекешеленетін әдістерге және айнымалыларға қол жеткізетін, тұйықталу көмегімен бірнеше көпшілік жария әдістерін сипаттау. Мұндай бағдарламалау мәнері modulepattern деп аталады. "Модуль", "шаблон" және "Javacript"деген іздеу сөздерін пайдалануға болады:
varCounter=(function(){varprivateCounter=0;functionchangeBy(val){privateCounter+=val; } return{ increment:function(){changeBy(1); }, decrement:function(){changeBy(-1); }, value:function(){returnprivateCounter; } }; })(); alert(Counter.value());/*Alerts0*/Counter.increment(); Counter.increment();alert(Counter.value());/*Alerts2*/Counter.decrement();alert(Counter.value());/*Alerts1*/ Мұнда көп нәрсе өзгерді. Алдыңғы мысалда әрбір тұйықталуда орындаудың (ортасы алған болса) өз контексті болды. Мұнда үш функция үшін біртұтас ортасын құрамыз: Counter.increment, Counter.decrement және Counter.value.
Жасырын функциялар құрамында бірыңғай орта құрылады, ол сипаттау сәтті орындалады. Бұл орта құрамында екі жекешелену элементі болады: privateCounter айнымалысы және changeBy фукциясы. Бірде-бір осы элементтердің бірі қол жетімді емес, тікелей ең анонимді функциялардан тыс болады. Оның орнына олар қолжетімді және үш жария функциялары пайдаланылуы тиіс, олар сол анонимді функцияларда орындалады, анонимді блок кодын қайтарады (anonymous wrapper).
Бұл жалпы контекстті орындауда (ортасы) пайдаланылатын,үш жария функциялары тұйықталу болып табылады. lexical scoping Javascript механизімі көмегімен, олар privateCounter айнымалысы мен changeBy функцияларына қол жеткізеді. Назар аударыңыз, есептегіш жасайтын анонимді фунцияны суреттейміз, және Counter айнымалының орындау нәтижесін тағайындап,оны бірден іске қосамыз. Бірақ бұл функцияны бірден іске қоспауымызға болады, оны жеке айнымалыны пайдалану үшін сақтап, одан әрі осылай бірнеше есептегіштерді құра аламыз:
varmakeCounter=function(){varprivateCounter=0;functionchangeBy(val){privateCounter+=val; } return{ increment:function(){changeBy(1); }, decrement:function(){changeBy(-1); }, value:function(){returnprivateCounter; } } }; varCounter1=makeCounter();varCounter2=makeCounter(); alert(Counter1.value());/*Alerts0*/ Counter1.increment();Counter1.increment();alert(Counter1.value());/*Alerts2*/Counter1.decrement();alert(Counter1.value());/*Alerts1*/alert(Counter2.value());/*Alerts0*/ Назар аударыңыз, бұл есептегіштер бір бірінен тәуелсіз жұмыс істейді. Мұның себебі, makeCounter() функциясымен олардың әрқайсысын құру кезінде, өзінің жеке контекстін орындау (ортасы) құрылған. Бұл шын мәнінде жеке өзіндік айнымалы,яғни әрбір есептегіштердің жекеше privateCounter айнымалысы.
Тұйықталуды осылайша пайдаланып, әдетте объектілі-бағытталған бағдарламалаумен байланысты оқшаулау және инкапсуляция сияқты, сіз бірнеше артықшылықтарды аласыз.
Тұйықталуды құру циклі: Өте жиі кездесетін қате.
ECMAScript 6 нұсқасы let кілт сөзін енгізді. Келесі мысалды қарастырайық:
id="help">Helpfulnoteswillappearhere
E-mail:type="text"id="email"name="email">
Name:type="text"id="name"name="name">
Age:type="text"id="age"name="age">
functionshowHelp(help){document.getElementById('help').innerHTML=help; } functionsetupHelp(){varhelpText=[ {'id':'email','help':'Вашадресe-mail'}, {'id':'name','help':'Вашеполноеимя'}, {'id':'age','help':'Вашвозраст(Вамдолжнобытьбольше16)'} ]; for(vari=0;i<helpText.length;i++){varitem=helpText[i]; document.getElementById(item.id).onfocus=function(){showHelp(item.help); } } } setupHelp(); Массив helpText үш кеңес үшін үш алаңды енгізуді сипаттайды. Цикл-бұл сипаттаулар кезек бойынша жүріп өтеді және әрбір енгізу өрісін анықтайды, бұл кезде onfocus оқиғалары үшін, бұл элементке керек функция туындайды, көрсететін тиісті ақпарат жазылып тұрады.
Егер сіз бұл кодты іске қоссаңыз, онда оның біз қалағандай жұмыс істемейтінін көруге болады. Сіз қандайда өрісті таңдасаңызда, кеңестер ретінде әрқашан құқы туралы хабарлама көрсетіледі.
Функциялар onfocus оқиғаларды өңдеуіштер ретінде берілген тұйықталу болып табылады. Олар setupHelp функциясынан мұраға қалдырылған функцияларды сипаттаудан және орындау (ортасынан) контексттен тұрады,.Үш тұйықталу құрылды, бірақ олардың барлығы бір контекстті орындаудан (ортада) құрылған. onfocus оқиғалар сәтінде туындаған цикл бұрыннан жұмыс істеді, ал item (үш тұйықталу) айнымалы массивтің соңғы элементін көрсетеді, ол өріске байланысты.
Бұл жағдайда шешім ретінде функцияларды, фабрикалық функцияларды (function factory), жоғарыда мысалда сипатталып айтылған пайдалануды ұсынуға болады:
function showHelp(help) {document.getElementById('help').innerHTML=help; } functionmakeHelpCallback(help){returnfunction(){showHelp(help); }; } functionsetupHelp(){varhelpText=[ {'id':'email','help':'Вашадресe-mail'}, {'id':'name','help':'Вашеполноеимя'}, {'id':'age','help':'Вашвозраст(Вамдолжнобытьбольше16)'} ]; for(vari=0;i<helpText.length;i++){varitem=helpText[i]; document.getElementById(item.id).onfocus=makeHelpCallback(item.help); } } setupHelp(); Міне, бұл жөнді жұмыс істейді. Барлығына бір ортадан бөлудің орнына makeHelpCallback функциясы әрбір тұйықталуға өзінің жекелігін жасайды, онда item айнымалы helpText массивтің дұрыс элементін көрсетеді.