1. Определение функции обратного вызова
Функция обратного вызова - это функция, вызванная через указатель функции. Если вы передаете указатель (адрес) функции в качестве аргумента другой функции, когда этот указатель используется для вызова функции, на которую он указывает, мы говорим, что это функция обратного вызова. Функция обратного вызова не вызывается непосредственно исполнителем функции, но называется другой стороной, когда происходит конкретное событие или условие, и используется для реагирования на событие или условие.
В JavaScript конкретное определение функции обратного вызова: функция A передается как параметр (ссылка на функцию) в другую функцию B, и эта функция B выполняет функцию A. Допустим, что функция A называется функцией обратного вызова. Если нет имени (выражение функции), оно называется анонимной функцией обратного вызова. Следовательно, обратный вызов не обязательно используется для асинхронности. Обратные вызовы часто используются в общих синхронных (блокирующих) сценариях, таких как требующие выполнения некоторых операций и выполняются функция обратного вызова.
пример
Примером использования обратных вызовов в синхронизации (блокировку) является выполнение Func2 после выполнения кода Func1.
var func1 = function (обратный вызов) {// Сделай что -нибудь. (Callback && typeof (обратный вызов) === "function") && callback ();} func1 (func2); var func2 = function () {}2. Использовать случаи функции обратного вызова
Загрузка ресурса: выполнить обратный вызов после динамической загрузки файлов JS, выполнить обратный вызов после загрузки iframe, выполнить обратный вызов после загрузки обратного вызова AJAX, выполнить обратный вызов после загрузки изображения, AJAX и т. Д.
События DOM и события Node.js основаны на механизме обратного вызова (обратные вызовы node.js могут иметь многослойные задачи гнездования обратного вызова).
Время задержки установки составляет 0. Этот взлом часто используется. Функция, вызванная SetTimeout, на самом деле является осуществлением обратного вызова
Цепный вызов: при цепном вызове легко реализовать цепный вызов в методе оценщика (SETTER) (или методами, которые не возвращают значения), но получение значения относительно трудно реализовать цепный вызов, поскольку вам нужен полученчик для возврата данных, которые вам нужны вместо этого указателя. Если вы хотите реализовать метод цепочки, вы можете использовать функцию обратного вызова для его реализации.
Вызовы функций SetTimeout и SetInterval получают их возвратное значение. Поскольку обе функции являются асинхронными, то есть время их вызовов и основной процесс программы относительно независимы, нет способа ждать их возвратной стоимости в теле, и программа не остановится и не будет ждать, когда они будут открыты, в противном случае значение SetTimeout и SetInterval будет потеряно. Следовательно, бессмысленно использовать возврат, поэтому можно использовать только обратный вызов. Значение обратного вызова заключается в том, чтобы уведомить функцию прокси о результатах выполнения таймера для своевременной обработки.
3. Функции также являются объектами
Если вы хотите понять функцию обратного вызова, вы должны сначала четко понять правила функции. В JavaScript функции странные, но они действительно объекты. Чтобы быть точным, функция - это объект функции, созданный с конструктором function (). Функциональный объект содержит строку, содержащую код JavaScript функции. Если вас перевели из C или Java, это может показаться странным, как код может быть строкой? Но для JavaScript это довольно распространено. Разница между данными и кодом является расплывчатой.
// функция может быть создана таким образом var fn = новая функция ("arg1", "arg2", "return arg1 * arg2;"); fn (2, 3); // 6Одним из преимуществ этого является то, что вы можете передавать код в другие функции, или вы можете передавать обычные переменные или объекты (потому что код буквально просто объект).
Передача функции в качестве обратного вызова
Легко передать функцию в качестве параметра.
Функция fn (arg1, arg2, callback) {var num = math.ceil (math.random () * (arg1 - arg2) + arg2); Callback (num); // пройти результат} fn (10, 20, function (num) {console.log («обратный вызов!Может быть, это кажется громоздким и даже немного глупым, почему бы не вернуть результат ненормально? Но когда вам нужно использовать функцию обратного вызова, вы можете так не думать!
Не мешай
Традиционные функции вводят данные в качестве параметров и используют возвратные операторы для возврата значений. Теоретически, в конце функции существует оператор возврата возврата, который структурирован: входная точка и выходная точка. Это легче понять. Функции по существу отображают процесс реализации между входом и выводом.
Однако, когда процесс реализации функции очень длинный, вы решите ждать, пока функция завершает обработку, или использовать функцию обратного вызова для выполнения асинхронной обработки? В этом случае использование функций обратного вызова становится критическим, например: Ajax запрос. Если вы используете функцию обратного вызова для обработки, код может продолжать выполнять другие задачи, не опустошив ее. В реальной разработке асинхронные вызовы часто используются в JavaScript, и это даже настоятельно рекомендуется здесь!
Ниже приведен более полный пример загрузки XML -файлов с использованием функции AJAX и использования функции Call () для вызова функции обратного вызова в контексте запрошенного объекта.
Функция fn (url, callback) {var httprequest; // Создать xhr httprequest = window.xmlhttprequest? new xmlhttprequest (): window.activexobject? new ActivexObject ("microsoft.xmlhttp"): не определен; // функциональное обнаружение для IE httprequest.onreadystatechange = function () {if (httprequest.readystate === 4 && httprequest.status == 200) {//callback. }}; httprequest.open ("Get", url); httprequest.send ();} fn ("text.xml", function () {// вызовать функцию console.log (this); // вывод после этого оператора}); console.log («Это будет работать до приведенного выше обратного вызова»); // это оператор выводит первымНаши запросы на асинхронную обработку означает, что когда мы начинаем запрашивать, мы говорим им, чтобы они назвали нашу функцию, когда они закончат. В реальных ситуациях обработчик событий OnearyStateChange также должен рассмотреть возможность сбоя запроса. Здесь мы предполагаем, что файл XML существует и может быть успешно загружен браузером. В этом примере асинхронная функция назначается событию OneReadyStateChange и поэтому не выполняется немедленно.
Наконец, сначала выполняется второй оператор Console.Log, поскольку функция обратного вызова не выполняется до завершения запроса.
Приведенный выше пример нелегко понять, поэтому посмотрите на следующий пример:
function foo () {var a = 10; return function () {a *= 2; вернуть А; }; } var f = foo (); f (); // return 20.f (); // возврат 40.Функция вызывается внешне и все еще может получить доступ к переменной a. Это все потому, что область в JavaScript лексична. Функциональный запуска в прицеле, который их определяет (область в примере выше), а не в прицеле, где эта функция выполняется. До тех пор, пока F определяется в Foo, он может получить доступ ко всем переменным, определенным в Foo, даже если выполнение Foo закончилось. Потому что его область будет сохранена, но только возвращенная функция может получить доступ к сохраненной области. Возвращение встроенной анонимной функции является наиболее распространенным методом для создания закрытия.
Выше приведено в этой статье, я надеюсь, что для всех будет полезно изучить программирование JavaScript.