解释一,通俗易懂:
一般写程序是你调用系统的API,如果把关系反过来,你写一个函数,让系统调用你的函数,那就是回调了,那个被系统调用的函数就是回调函数。
解释二,通俗易懂:
一般一个函数调用另一个函数,被调用的函数是出现在方法体当中,而回调函数比较特殊,它是出现在参数列表当中.也就是说,当调用的时候,需要从其他地方拿到这个(回调)函数,以参数的形式传入.
解释三,看完较具体地理解了的回答:
回调函数叫callback function,其实更好的定义是"call after" function。
让我用人话解释一下,回调函数是一个函数,将会在另一个函数完成执行后立即执行。回调函数是一个作为参数传给另一个 JavaScript 函数的函数,这个回调函数会在传给的函数内部执行。
引用Stack Overflow上面一个比较好的说明:
A callback function is a function which is:accessible by another
function, and is invoked after the first function if that first
function completes
下面举两个例子就能很清晰了:
function greeting(name) {
alert('Hello ' + name);
}
function processUserInput(callback) {
var name = prompt('请输入你的名字。');
callback(name);
}
processUserInput(greeting);
以上范例为 同步 回调,它是立即执行的。
然而需要注意的是,回调函数经常被用于继续执行一个异步完成后的操作,它们被称为异步回调。
另一个例子:
// A function which accepts another function as an argument
// (and will automatically invoke that function when it completes - note that there is no explicit call to callbackFunction)
function printANumber(number, callbackFunction) {
console.log("The number you provided is: " + number);
setTimeout(function() {
callbackFunction(); }, 3000);
console.log("second");
}
// a function which we will use in a driver function as a callback function
function printFinishMessage() {
console.log("I have finished printing numbers.");
}
// Driver method
printANumber(6, printFinishMessage);
执行printANumber函数后,结果:
> "The number you provided is: 6"
> "second"
> "I have finished printing numbers."
可以看到先输出"The number you provided is: 6",“second”,延时三秒后输出"I have finished printing numbers."
所以我们可以认为callbackFunction的实际执行是在主函数体printANumber的方法体执行完才执行。
这对我们意义非常重大,例如我们在一个网页有关的函数中调用外部API,我们肯定需要异步执行,然后传入回调函数,如果是同步执行,是阻塞的,我们需要等待调用API结果之后才能执行后面的函数,这样可能会造成界面加载卡顿、延时的情况发生,而使用回调函数异步执行,则不影响我们后面函数的执行,是非阻塞的。