A callback function, also known as a higher-order function, is a function that is passed to another function (let’s call this other function “otherFunction”) as a parameter, and the callback function is called (or executed) inside the otherFunction.
This can be useful when you are trying to execute two functions that are dependent in one another.
- JQuery uses a lot of callback functions without us realizing it.
JQuery Click example
$('#btn').click(function(){
console.log("Button clicked");
});
In the example above we are passing in an anonymous function into the click function. Somewhere inside the click function our anonymous function will execute.
- Another example is the foreach function
Foreach Example
var names = ["A","B","C","D"];
names.foreach(function(name,index){
console.log(index + " " + name);
});
We are passing in again an anonymous function into the foreach function to execute the console.log message.
To write a callback function all you need to do it create 2 functions and pass one function as a parameter into the other.
//A general output message function
function OutputMessage(data)
{
if (typeof data === "string")
{
console.log("This is a string: " + data);
}
else if (typeof data == "object")
{
console.log("This is a object);
for(var item in data)
{
console.log(item + " " + data[item]);
}
}
}
//Function to take in the callback function
var InputMessage(userData, callback)
{
console.log("Going to execute the function now");
callback(userData);
}
//So now to call the function and see what will happen
InputMessage({name:"A",age:"27"},OutputMessage)
//Result:
//This is a object
//name A
//age 27
InputMessage("String Message",OutputMessage)
//Result:
//This is a string: String Message
The example above shows how to pass a function into another function as a parameter
One problem that people face when using callback functions is preserving ‘this’
The example below will show how this can be done:
//An Object that has a function inside to set the first and last names
var obj = {
firstName: "A",
lastName: "B",
SetName: function(first,last)
{
this.firstName = first;
this.lastName = last;
}};
function UserInput(firstName,lastName,callback)
{
callback(firstName,lastName);
}
//When using the function UserInput to call obj's function directly
//you will not get the correct result
UserInput("C","D",obj.SetName);
//The this in this case will mean the global windows variables.
console.log(window.firstName + " " + window.lastname); //C D
//Instead you need to pass the correct this into the function to do this
//you need to change the functions a little
function UserInput(firstName,lastName,callback,callbackObj)
{
callback.apply(callbackObj,[firstName,lastName]);
}
//Now this will use the obj as the correct this
UserInput("C","D",obj.SetName,obj);
//This will now edit the variables inside the obj
console.log(obj.firstName + " " + obj.lastName)// C D
http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/