Ответ 1
CLOSURES
Закрытие сначала немного раздувается. Это функция javaScript и несколько других современных компьютерных языков.
Закрытие формируется исполняемым экземпляром функции, которая имеет внутреннюю функцию (обычно это анонимный обработчик события или именованный метод), который нуждается в доступе к одной или нескольким внешним переменным (т.е. переменным, находящимся внутри внешней функции, но снаружи внутренняя функция). Разумная вещь заключается в том, что внутренняя функция сохраняет доступ к внешним переменным, даже если внешняя функция завершена и возвращена во время выполнения внутренней функции!
Кроме того, переменные, захваченные замыканием, доступны только для внутренних функций, а не для более благоприятной среды, которая привела к замыканию. Эта функция позволяет нам, например, создавать классовые структуры как с частными, так и с публичными членами даже в отсутствие языковых ключевых слов "Public" и "Private".
Закрытия становятся возможными благодаря использованию внешними переменными внешних функций, подавляющих сбор мусора javaScript, которые иначе разрушали бы внешнюю функциональную среду в некоторой неопределенной точке после завершения.
Важность закрытия для хорошего, аккуратного программирования javaScript не может быть перенапряжена.
В приведенном ниже коде функция getData()
формирует при каждом вызове замыкание, улавливающее id1
и id2
(и url
), которые остаются доступными для анонимного обработчика ответа ajax (третий аргумент $.get).
$(document).ready(function() {
function getData(url, id1, id2) {
$.get(url, Common.genSafeId(), function(data) {
$(id1).html(data);
$(id2).addClass("empty");
});
}
getData('/activity', '#stream', '#load_activity');
getData('/messages', '#message', '#load_messages');
getData('/deals', '#new_deals_container', '#load_deal');
getData('/tasks', '#task_frames', '#load_task');
});
Таким образом, вместо того, чтобы писать четыре отдельных обработчика, мы используем способность языка формировать замыкания и вызывать одну и ту же функцию getData()
четыре раза. При каждом вызове getData()
формирует новое замыкание, которое позволяет обработчику ответа $.get(который называется асинхронно, когда сервер отвечает), чтобы адресовать его элементы DOM.