Представьте, что ваш друг покидает ваш дом, и вы говорите ей: «Позвони мне, когда вернешься домой, чтобы я знал, что ты благополучно прибыл»;это (буквально) обратный вызов .Вот что такое функция обратного вызова, независимо от языка.Вы хотите, чтобы какая-то процедура возвращала управление вам, когда она выполнила какое-то задание, поэтому вы даете ей функцию, которую можно использовать для обратного вызова вам.
В Python, например,
grabDBValue( (lambda x: passValueToGUIWindow(x) ))
grabDBValue
можно записать, чтобы получить только значение из базы данных, а затем указать, что на самом деле делать со значением, чтобы оно принимало функцию.Вы не знаете, когда или если grabDBValue
вернется, но если / когда это произойдет, вы знаете, что хотите, чтобы он сделал.Здесь я передаю анонимную функцию (или lambda ), которая отправляет значение в окно графического интерфейса.Я мог бы легко изменить поведение программы, выполнив это:
grabDBValue( (lambda x: passToLogger(x) ))
Обратные вызовы хорошо работают в языках, где функции имеют значения первого класса , как обычные целые числа, строки символов, логические значенияи т. д. В C вы можете «передавать» функцию, передавая указатель на нее, и вызывающая сторона может использовать это;в Java вызывающая сторона будет запрашивать статический класс определенного типа с определенным именем метода, поскольку за пределами классов нет никаких функций («методов»);а в большинстве других динамических языков вы можете просто передать функцию с простым синтаксисом.
Protip:
В языках с лексическим ограничением (например, Scheme или Perl) вы можете использоватьхитрость, подобная этой:
my $var = 2;
my $val = someCallerBackFunction(sub callback { return $var * 3; });
# Perlistas note: I know the sub doesn't need a name, this is for illustration
$val
в этом случае будет 6
, потому что обратный вызов имеет доступ к переменным, объявленным в среде lexical , где он был определен.Лексическая область действия и анонимные обратные вызовы - мощная комбинация, требующая дальнейшего изучения для начинающего программиста.