Top Qs
Timeline
Chat
Perspective
Callback (computer programming)
A function passed as data to and to be called by another function From Wikipedia, the free encyclopedia
Remove ads
Remove ads
In computer programming, a callback is a function that is stored as data (a reference) and designed to be called by another function – often back to the original abstraction layer.
This article needs additional citations for verification. (September 2015) |

A function that accepts a callback parameter may be designed to call back before returning to its caller which is known as synchronous or blocking. The function that accepts a callback may be designed to store the callback so that it can be called back after returning which is known as asynchronous, non-blocking or deferred.
Programming languages support callbacks in different ways such as function pointers, lambda expressions and blocks.
A callback can be likened to leaving instructions with a tailor for what to do when a suit is ready, such as calling a specific phone number or delivering it to a given address. These instructions represent a callback: a function provided in advance to be executed later, often by a different part of the system and not necessarily by the one that received it.
The term callback can be misleading, as it does not necessarily imply a return to the original caller, unlike a telephone callback.
Remove ads
Use
Summarize
Perspective
A blocking callback runs in the execution context of the function that passes the callback. A deferred callback can run in a different context such as during interrupt or from a thread. As such, a deferred callback can be used for synchronization and delegating work to another thread.
Event handling
A callback can be used for event handling. Often, consuming code registers a callback for a particular type of event. When that event occurs, the callback is called.
Callbacks are often used to program the graphical user interface (GUI) of a program that runs in a windowing system. The application supplies a reference to a custom callback function for the windowing system to call. The windowing system calls this function to notify the application of events like mouse clicks and key presses.
Asynchronous action
A callback can be used to implement asynchronous processing. A caller requests an action and provides a callback to be called when the action completes which might be long after the request is made.
Polymorphism
A callback can be used to implement polymorphism. In the following pseudocode, say_hi
can take either write_status
or write_error
.
def write_status(string message):
write(stdout, message)
def write_error(string message):
write(stderr, message)
def say_hi(write):
write("Hello world")
Remove ads
Implementation
Summarize
Perspective
The callback technology is implemented differently by programming language.
In assembly, C, C++, Pascal, Modula2 and other languages, a callback function is stored internally as a function pointer. Using the same storage allows different languages to directly share callbacks without a design-time or runtime interoperability layer. For example, the Windows API is accessible via multiple languages, compilers and assemblers.
C++ also allows objects to provide an implementation of the function call operation. The Standard Template Library accepts these objects (called functors) as parameters.
Many dynamic languages, such as JavaScript, Lua, Python, Perl[1][2] and PHP, allow a function object to be passed.
CLI languages such as C# and VB.NET provide a type-safe encapsulating function reference known as delegate.
Events and event handlers, as used in .NET languages, provide for callbacks.
Functional languages generally support first-class functions, which can be passed as callbacks to other functions, stored as data or returned from functions.
Many languages, including Perl, Python, Ruby, Smalltalk, C++ (11+), C# and VB.NET (new versions) and most functional languages, support lambda expressions, unnamed functions with inline syntax, that generally acts as callbacks..
In some languages, including Scheme, ML, JavaScript, Perl, Python, Smalltalk, PHP (since 5.3.0),[3] C++ (11+), Java (since 8),[4] and many others, a lambda can be a closure, i.e. can access variables locally defined in the context in which the lambda is defined.
In an object-oriented programming language such as Java versions before function-valued arguments, the behavior of a callback can be achieved by passing an object that implements an interface. The methods of this object are callbacks.
In PL/I and ALGOL 60 a callback procedure may need to be able to access local variables in containing blocks, so it is called through an entry variable containing both the entry point and context information. [5]
Remove ads
Example code
Summarize
Perspective
C
Callbacks have a wide variety of uses, for example in error signaling: a Unix program might not want to terminate immediately when it receives SIGTERM, so to make sure that its termination is handled properly, it would register the cleanup function as a callback. Callbacks may also be used to control whether a function acts or not: Xlib allows custom predicates to be specified to determine whether a program wishes to handle an event.
In the following C code, function print_number
uses parameter get_number
as a blocking callback. print_number
is called with get_answer_to_most_important_question
which acts as a callback function. When run the output is: "Value: 42".
#include <stdio.h>
#include <stdlib.h>
void print_number(int (*get_number)(void)) {
int val = get_number();
printf("Value: %d\n", val);
}
int get_answer_to_most_important_question(void) {
return 42;
}
int main(void) {
print_number(get_answer_to_most_important_question);
return 0;
}
C++
In C++, functor can be used in addition to function pointer.
C#
In the following C# code,
method Helper.Method
uses parameter callback
as a blocking callback. Helper.Method
is called with Log
which acts as a callback function. When run, the following is written to the console: "Callback was: Hello world".
public class MainClass
{
static void Main(string[] args)
{
Helper helper = new Helper();
helper.Method(Log);
}
static void Log(string str)
{
Console.WriteLine($"Callback was: {str}");
}
}
public class Helper
{
public void Method(Action<string> callback)
{
callback("Hello world");
}
}
Kotlin
In the following Kotlin code, function askAndAnswer
uses parameter getAnswer
as a blocking callback. askAndAnswer
is called with getAnswerToMostImportantQuestion
which acts as a callback function. Running this will tell the user that the answer to their question is "42".
fun main() {
print("Enter the most important question: ")
val question = readLine()
askAndAnswer(question, ::getAnswerToMostImportantQuestion)
}
fun getAnswerToMostImportantQuestion(): Int {
return 42
}
fun askAndAnswer(question: String?, getAnswer: () -> Int) {
println("Question: $question")
println("Answer: ${getAnswer()}")
}
JavaScript
In the following JavaScript code, function calculate
uses parameter operate
as a blocking callback. calculate
is called with multiply
and then with sum
which act as callback functions.
function calculate(a, b, operate) {
return operate(a, b);
}
function multiply(a, b) {
return a * b;
}
function sum(a, b) {
return a + b;
}
// outputs 20
alert(calculate(10, 2, multiply));
// outputs 12
alert(calculate(10, 2, sum));
The collection method .each()
of the jQuery library uses the function passed to it as a blocking callback. It calls the callback for each item of the collection. For example:
$("li").each(function(index) {
console.log(index + ": " + $(this).text());
});
Deferred callbacks are commonly used for handling events from the user, the client and timers. Examples can be found in addEventListener
, Ajax and XMLHttpRequest
.
[6]
In addition to using callbacks in JavaScript source code, C functions that take a function are supported via js-ctypes.[7]
Red and REBOL
The following REBOL/Red code demonstrates callback use.
- As alert requires a string, form produces a string from the result of calculate
- The get-word! values (i.e., :calc-product and :calc-sum) trigger the interpreter to return the code of the function rather than evaluate with the function.
- The datatype! references in a block! [float! integer!] restrict the type of values passed as arguments.
Red [Title: "Callback example"]
calculate: func [
num1 [number!]
num2 [number!]
callback-function [function!]
][
callback-function num1 num2
]
calc-product: func [
num1 [number!]
num2 [number!]
][
num1 * num2
]
calc-sum: func [
num1 [number!]
num2 [number!]
][
num1 + num2
]
; alerts 75, the product of 5 and 15
alert form calculate 5 15 :calc-product
; alerts 20, the sum of 5 and 15
alert form calculate 5 15 :calc-sum
Rust
Rust have the Fn
, FnMut
and FnOnce
traits.[8]
fn call_with_one<F>(func: F) -> usize
where F: Fn(usize) -> usize {
func(1)
}
let double = |x| x * 2;
assert_eq!(call_with_one(double), 2);
Lua
In this Lua code, function calculate
accepts the operation
parameter which is used as a blocking callback. calculate
is called with both add
and multiply
, and then uses an anonymous function to divide.
function calculate(a, b, operation)
return operation(a, b)
end
function multiply(a, b)
return a * b
end
function add(a, b)
return a + b
end
print(calculate(10, 20, multiply)) -- outputs 200
print(calculate(10, 20, add)) -- outputs 30
-- an example of a callback using an anonymous function
print(calculate(10, 20, function(a, b)
return a / b -- outputs 0.5
end))
Python
In the following Python code, function calculate
accepts a parameter operate
that is used as a blocking callback. calculate
is called with square
which acts as a callback function.
def square(val):
return val ** 2
def calculate(operate, val):
return operate(val)
# outputs: 25
calculate(square, 5)
Julia
In the following Julia code, function calculate
accepts a parameter operate
that is used as a blocking callback. calculate
is called with square
which acts as a callback function.
julia> square(val) = val^2
square (generic function with 1 method)
julia> calculate(operate, val) = operate(val)
calculate (generic function with 1 method)
julia> calculate(square, 5)
25
Remove ads
See also
References
External links
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads