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

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

05.10.2015, 04:29. Показов 4392. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru