Функции JavaScript могут обращаться к их:
Если функция обращается к своей среде, то функция является закрытием.
Обратите внимание, что внешние функции не требуются, хотя они предлагают льготы, которые я здесь не обсуждаю. Получая доступ к данным в своей среде, закрытие сохраняет эти данные. В подслучае внешних / внутренних функций внешняя функция может создавать локальные данные и, в конечном счете, выходить, и все же, если какая-либо внутренняя функция (ы) выживает после выхода внешней функции, тогда внутренняя функция (ы) сохраняет локальные данные внешней функции живой.
Пример закрытия, использующего глобальную среду:
Представьте, что события кнопки «Переполнение стека» и «Голос-вниз» реализованы как закрытие, voteUp_click и voteDown_click, что имеют доступ к внешним переменным isVotedUp и isVotedDown, которые определены глобально. (Для простоты я имею в виду кнопки «Голос голоса» StackOverflow, а не массив кнопок «Ответ на голосование».)
Когда пользователь нажимает кнопку VoteUp, функция voteUp_click проверяет, является ли isVotedDown == true, чтобы определить, голосовать или просто отменять пониженное голосование. Функция voteUp_click является закрытием, потому что она обращается к своей среде.
var isVotedUp = false;
var isVotedDown = false;
function voteUp_click() {
if (isVotedUp)
return;
else if (isVotedDown)
SetDownVote(false);
else
SetUpVote(true);
}
function voteDown_click() {
if (isVotedDown)
return;
else if (isVotedUp)
SetUpVote(false);
else
SetDownVote(true);
}
function SetUpVote(status) {
isVotedUp = status;
// Do some CSS stuff to Vote-Up button
}
function SetDownVote(status) {
isVotedDown = status;
// Do some CSS stuff to Vote-Down button
}
Все четыре из этих функций являются закрытием, поскольку все они обращаются к своей среде.