Что такое замыкания и обратные вызовы? - PullRequest
18 голосов
/ 15 января 2010

Что такое замыкания и обратные вызовы в JavaScript? Мне еще предстоит найти хорошее объяснение того или другого.

1 Ответ

37 голосов
/ 15 января 2010

Закрытия уже хорошо обработаны в Stackoverflow, вот только выбор: -

Как работает закрытие JavaScript?
Что именно означает «замыкание» в JavaScript?
Можете ли вы сказать, что это правильный пример закрытия Javascript .. Где места, которые мы должны рассмотреть, чтобы избежать закрытия ??
Объем и закрытие JavaScript
Javascript Closures и "этот" контекст
JavaScript - Как узнать об использовании «замыканий»?

Обратные вызовы - более простая концепция. Обратный вызов в основном, когда функция принимает другую функцию в качестве параметра. В какой-то момент во время выполнения вызываемая функция выполнит функцию, переданную в качестве параметра, это callback . Довольно часто обратный вызов фактически происходит как асинхронное событие, и в этом случае вызываемая функция может вернуться без выполнения обратного вызова, что может произойти позже. Вот общий пример (на основе браузера): -

 function fn() { alert("Hello, World"); }
 window.setTimeout(fn, 5000);

Здесь функция fn передается как callback в функцию setTimeout. Заданное время ожидания возвращается немедленно, однако через 5 секунд выполняется функция, переданная как callback .

Закрытия и обратные вызовы

Довольно часто причиной создания замыканий (случайно, случайно или преднамеренно) является необходимость создания обратного вызова. Например: -

 function AlertThisLater(message, timeout)
 {
     function fn() { alert(message); }
     window.setTimeout(fn, timeout);
 }

 AlertThisLater("Hello, World!", 5000);

(Пожалуйста, прочитайте некоторые из связанных сообщений, чтобы понять закрытия)

Создается замыкание, содержащее частично параметр message, fn выполняется через некоторое время после возврата вызова AlertThisLater, но fn по-прежнему имеет доступ к исходному содержимому message.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...