Тұйықталу
Лексикалық көру облысы. Келесі мысалды қарастырайық:
function init() {
var name = "Mozilla"; // name - локальная переменная, созданная в init
function displayName() { // displayName() - внутренняя функция, замыкание
alert (name); // displayName() использует переменную, объявленную в родительской функции
}
displayName();
}
init();
init() функциясы name айнымалы локальын жасайды, содан кейін displayName() фукнциясы туындайды. displayName() — бұл ішкі функция, ол иinit() ішінде және тек осы функциялар денелерінің ішінде анықталған. init(), displayName() –ның локальды айнымалылар айырмашылығы жоқ және оның орнына name өзгерістері, белгілі бір басты функциясында пайдаланады.
Бұл кодты орындаңыз және ол қалай жұмыс істейтінін қараңыз. Бұл лексикалық көріну облысы (lexical scoping ) деп аталатын үлгі: JavaScript- айнымалының қолданылу саласы, оның кодта орналасуы (бұл анық лексически) бойынша анықталады, және салынған функциялар сырттай жарияланған айнымалыларға қол жеткізе алады. Бұл механизм Lexical scoping (қолданылу саласы, шектелген лексика) деп аталады.
Келесі мысалды қарастырайық:
function makeFunc() { var name = "Mozilla";
function displayName() { alert(name);
}
return displayName;
};
var myFunc = makeFunc(); myFunc();
Егер орындасақ, оның алдыңғы мысалдағы init() әсеріндей болады: "Mozilla" қатары JavaScript alert диалогында көрсетілген. Айырмашылығы
displayName() ішкі функциясы орындалғанға дейін сырттан қайтарылады.
Қарапайым жағдайда, функцияда локальды айнымалылар оны орындау кезінде ғана бар. makeFunc() шақырғаннан кейін, енді бұл name айнымалысы қол жетімсіз болатынын күтуге болады. Бұл, әлбетте, тұйықталу жағдайында емес.
Бұл басқатырғыштардың шешімі, myFunc тұйықталуға айналуы. Тұйықталу — бұл объектінің ерекше түрі, онда екі нәрсені біріктіреді: функцияны және онда функция құрылған оның ортасын. Орталар жаңа іс- қимыл саласындағы функциялардың тұйықталуының құрылуындағы кез келген локальдық айнымалыдан тұрады. Бұл жағдайда, myFunc — бұл тұйықталу, ол displayName функциясын, және "Mozilla"қатарын, тұйықталууақытындаболған құруды қамтиды.
Мұнда қызықты мысал —makeAdder функциясы:
function makeAdder(x) { return function(y) { return x + y;
};
};
var add5 = makeAdder(5); var add10 = makeAdder(10); console.log(add5(2)); // 7
console.log(add10(2)); // 12
Мұнда makeAdder(x) функциясын анықтадық, ол х таңдайды және жаңа функцияны қайтарады. Бұл функция y –ті алады, және x және y қосындысын қайтарады.
Бұл мәні бойынша, makeAdder фабрикалық функциясы — ол
нақты мәндері үшін өз аргументтерін қосуы мүмкін функцияларды жасайды. Жоғарғы мысалда фабрикалық функцияны екі жаңа функция құру үшін қолданамыз – бірінші оның аргументі ретінде 5 мәнін анықтайды, екіншісі - 10.
add5 және add10 - тұйықталу мысалдары болып табылады. Осы функциялардың денесі бірдей, бірақ олар түрлі ортаны сақтайды. add5 х функциясын қоршалған – 5, ал бұл уақытта add10 х функциясы қоршалған
– 10.
Достарыңызбен бөлісу: |