Форум программистов, компьютерный форум, киберфорум
JavaScript: API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
 Аватар для w3lifer
1 / 1 / 0
Регистрация: 31.03.2014
Сообщений: 78

Почему callback-функции называются функциями ОБРАТНОГО вызова

05.10.2015, 04:29. Показов 4322. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени.
Нуждаюсь в объяснении.
Очередной вопрос в стиле «Что такое callback-функции и зачем они нужны».
Я уже перечитал (некоторую по несколько раз) много информации, но так и не понял что это и зачем его есть ... В частности перелопатил 1.5 страницы результатов Google и поиск на CyberForum ...

Вопрос: Что значит «обратного вызова»: обратного; в смысле вызываются ещё раз или в смысле вызываются в обратную сторону?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.10.2015, 04:29
Ответы с готовыми решениями:

Заменить делегаты функциями обратного вызова
public event EventHandler<EventClientArgs> OnNewClient; /// <summary> /// Обработка добавления нового клиента -...

Асинхронное программирование: почему в AsyncCallback не указать метод обратного вызова
Доброго времени суток ! Не могу понять вот эту строчку r.BeginGetResponse(new AsyncCallback((IAsyncResult res) => { }), null);, это...

Реализация функции обратного вызова
Я так понимаю использование механизма callback в Java это стандартная практика. Но пока не смог найти внятного примера как это реализовать....

3
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
05.10.2015, 08:16
Цитата Сообщение от w3lifer Посмотреть сообщение
Почему callback-функции называются функциями ОБРАТНОГО вызова
перевод такой: call -- "вызвать", back -- "назад", "обратно".
Цитата Сообщение от w3lifer Посмотреть сообщение
Что значит «обратного вызова»
видимо, это просто устоявшаяся ассоциация... не думаю, что я определение скажу вам лучше, чем это сделает вики или учебник, поэтому постараюсь объяснить сам, откуда такая ассоциация.
callback -- это точно такая же функция, как и остальные. И правила на нее действуют те же самые, при вызове. Они не вызываются "еще раз", хотя, как и любые другие функции, могут, но это не есть ее признак.
Цитата Сообщение от w3lifer Посмотреть сообщение
так и не понял что это и зачем его есть
Приведу простой пример. Допустим, стоит задачка показать на странице часики, причем не абы какие, а с секундами, поэтому и обновлять их нужно каждую секунду. Как вы ее решите?
Первое, что придет в голову, это будет что-то вроде
JavaScript
1
2
3
4
5
var clockElem = document.getElementById('myclock');
while (true) {
  clockElem.innerHTML = new Date().toTimeString();
  sleep(1000);
}
где sleep(1000) выполняет задержку на 1000 миллисекунд = 1 секунде. При этом программа будет крутиться вокруг этого одного цикла, и не выйдет из него (вы же знаете, что процессор -- это не квант, и в двух состояниях одновременно находиться не может, верно?) соответственно, никакой другой код выполняться не сможет.
А вы хотите чтоб кроме часиков у вас еще работали всплывающие подсказки, показывались формочки при нажатии на кнопке, чтоб гугль эдсенс работал, да и вообще чтоб страница не зависла наглухо, потому что на самом деле подобный код заблокирует весь поток браузера для этой страницы.
Так вот, что делать? Если подумать, то вам всего лишь раз в секунду нужно исполнить кусок кода
JavaScript
1
clockElem.innerHTML = new Date().toTimeString();
И не более того. Всего одна строчка. И в js придумали такое решение, как события. Событий много, чаще всего они от пользователя поступают, но вот тут вот одни поступают от некоего внутреннего абстрактного таймера.
Делается это с помощью специальных функций setTimeout и setInterval. А работают они очень просто -- они регистрируют событие таймера, и позволяют программисту определить, что произойдет при наступлении этого события. То есть вы говорите, мол каждую секунду, сделайте то, что я щас напишу. Но как это написать? Как задать какой-то блок кода, чтоб его можно было выполнить?
Помните, какой структурной единицей являются блоки кода? Правильно, подпрограммами. А в js-е подпрограммы называются функциями. Мы просто указываем функцию как один из аргументов setTimeout, или в данном случае, setInterval, и она будет исполняться при наступлении события от таймера, когда пройдет указанное вами время.
JavaScript
1
2
3
4
5
6
function onTimer() {
  var clockElem = document.getElementById('myclock');
  clockElem.innerHTML = new Date().toTimeString();
}
 
setInterval(onTimer, 1000);
Функции являются обычными переменными, в js, они т.н. first-class citizen (понятия не имею как это по-русски, но уверен, что нагуглить труда не составит) в контексте этого языка. Их можно передавать как фактические параметры в функции, и делать их анонимными:
JavaScript
1
2
3
4
5
6
var onTimer = function(){
  var clockElem = document.getElementById('myclock');
  clockElem.innerHTML = new Date().toTimeString();
}
 
setInterval(onTimer, 1000);
или даже просто
JavaScript
1
2
3
4
setInterval(function(){
  var clockElem = document.getElementById('myclock');
  clockElem.innerHTML = new Date().toTimeString();
}, 1000);
можно писать по всякому.

Не по теме:

Обычно, когда функция присваевается переменной, а не создается конструкция вида function func_name() {} область ее видимости становится более очевидной, хотя на самом деле, насколько мне известно, они совпадают, но тут я уже не уверен


События бывают не только от таймера. У каждого DOM-элемента на странице (за редким исключением) есть события onclick, onmousemove, onresize итд, у текстовых полей можно делать произвольный код при нажатии любой клавиши (вернее, почти любой), и чуть и не полностью переопределять стандартное поведение, "навязываемое" браузером, или дополнить его в том или ином виде. И все ваши переопределения сработают только тогда, когда произойдет заданное вами событие, и не ранее того. И неважно, что у вас будет в коде, скажем, миллион строчек -- всегда исполняться будет только то, что должно, а не все подряд.
Такой подход, что код исполняется не постоянно, а по мере наступления событий -- это один из способов т.н. асинхронного подхода к программрованию

Не по теме:

еще есть, как минимум, промисы с фьючерсами, которые кстати, добавили в стандарт ES6. А также сопрограммы, которые тоже отчасти были добавлены, или добавляются, в виде генераторов, в ECMAScript (он же JavaScript в данном контексте)


Так вот. Эти самые функции, которые вызываются извне, платформой (в данном случае, браузером) при наступлении некоторого события, и есть коллбек-функции. Однако, иногда они вызываются и из пользовательского кода, когда это удобно.
А называются они так, ну как мне кажется, потому что происходит вызов кода, который физически расположен в том же месте (даже на одной строчке), где вы устанавливаете обработчик. Хотя на самом деле, код, который вызовет вашу функцию, находится где-то совершенно в другом месте, вплоть до самого браузернго движка. И это своего рода передает управление как-бы "обратно", в ваш код.
Не знаю, понятна ли ассоциация, если не очень, то рекомендую в любом случае начать с изучения функций высшего порядка, с функциональных языков -- там это применяется чаще, а потому объяснено подробнее. js конечно тоже отчасти функционален, но императивные штуки, при обучении таким вещам, могут просто отвлекать, на самом деле.

Не по теме:

про хаскель шутка, есть и более простые языки, например, erlang, или lisp, который приведен в качестве примера в замечательной книжке о программировании в целом, SICP

4
 Аватар для w3lifer
1 / 1 / 0
Регистрация: 31.03.2014
Сообщений: 78
19.03.2016, 23:30  [ТС]
NEbO, что-то я вам тогда (когда вы мне ответили) и спасибо не сказал?... Вроде бы (так как вы много написали, а мозги у меня кипели) я просто вскользь пробежался по тексту и всё: оставил на потом (точно помню, что читал; но, по-моему, не до конца) .

Ну так вот. Вы очень доступно описали принцип работы callback-функций — спасибо. Но меня всегда (ну, с тех пор как я начал изучать программирование) интересовал вопрос: «Почему, блин, "callback"?».

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

Общий пример: если мы разбираемся в том, что значит какое-нибудь заимствованное словечко, то нужно узнать его этимологию; всё: определение можно даже не смотреть .
Частный пример: «Что, блин, такое проприетарный?». Это слово может наводить кучу недопониманий; однако всё просто: переведём на русский слово proprietaryчастный; всё стало понятно, неправда ли? Даже не нужно лезть в Wikipedia и искать определение, потому как оно уже не нужно: проприетарныйчастный (находящийся в частной собственности) ...

Я до сих пор не могу понять зачем это делать: брать английские слова и заимствовать по их прямому звучанию в русский (скоро все на английской трасянке будет разговаривать; аля «Го ту магазин», «Сколько тайм», «Дай пен» и так далее) ... А недавно по зомбиящику слышал (в новостях или «ЧП», не помню точно) накануне 8 Марта:

«Полиция будет их различать по гендерному признаку.»
О, боже! Заткните мне уши ...

Почему, почему блин не сказать по-русски: «по половому признаку»; и все бы поняли, а не строили догадки?..
Я просто у Матери спросил сразу: «Ты поняла, что такое "по гендерному признаку"?».
Она ответила: «Наверное, "по половому признаку"?».
То есть, наверное! А вот если бы по зомбику сказали по-русски, то и вопроса моего не возникло.

Gender — (с англ.) пол (мужской/женский, а не деревянный ) ...

К чему это я?.. А к тому, что тоже самое и в программировании: позаимствуют кучу слов и потом сиди-разбирайся что-к-чему-да-как .

Вау! Нифигассе я написал уже ... К делу.

В общем не знаю точно это или нет, но callback'ами, по-моему, их назвали потому, так как они работают как спусковые рычаги/крючки (triggers, на трасянке — тригеры): базовая функция сработала и нажала спусковой рычаг — произошёл запуск callback-функции; а именно само слово взято из аналогии «перезвони» — по-простому «сопля», «глухарь», «бомжик»; то есть когда у первого абонента нет денег, но ему нужно поговорить со вторым абонентом, поэтому он совершает ему неполноценный звонок: «соплю» — второй абонент, увидев пропущенный вызов, перезванивает первому и все довольны .

Добавлено через 22 часа 7 минут
Одна трасянка вокруг :

Блин у меня бот на жс в тикс чате работает, с этим оператором))

https://learn.javascript.ru/fu... 2578722399

Осталось совсем чуть-чуть :

Фак у меня бот на жс в тикс чате воркает, с этим оператором))

0
 Аватар для w3lifer
1 / 1 / 0
Регистрация: 31.03.2014
Сообщений: 78
28.03.2016, 11:31  [ТС]
Да, всё-таки я примерно угадал ...

Можно прочесть (англ.) здесь: http://stackoverflow.com/a/14220323/4223982; под заголовком «Asynchronous».

P. S. Всё вертится вокруг асинхронной работы функций.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.03.2016, 11:31
Помогаю со студенческими работами здесь

Стрелка в описании функции обратного вызова
#include <iostream> #include <algorithm> std::string s = "hello"; auto end = std::unique(s.begin(), s.end(), (char a, char b) -> bool...

3 способа задания функции обратного вызова
Начал изучение C#. Надолго застрял разбираясь в витруальных методах, интерфейсай делегатах, функциях обратного вывова. Решил упорядочить...

Передать результат функции в функцию обратного вызова
Доброго времени суток. Есть функция newDataSaving. Результат ее работы (массив student) надо передать в функцию обратного вызова -...

Почему некоторые функции в роде strcat называются небезопасными?
И что даёт использование их безопасных аналогов?

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru