回调函数——callback

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回调函数——callback相关的知识,希望对你有一定的参考价值。

参考技术A 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。
实际上,也就是把函数作为参数传递。

在jQuery中, hide的方法大概是这样子的

使用的时候,

我们只需要在里面写一个简单的函数

Callback 函数在当前动画 100% 完成之后执行。然后我们就可以看到真正的现象,当id为element的元素隐藏后,会在console中输出Hide。

就也就意味着:Callback实际上是,当一个函数执行完后,现执行的那个函数就是所谓的callback函数。

正常情况下函数都是按顺序执行的,然而javascript是一个事件驱动的语言。

所以正常情况下都会按顺序执行的,然而当执行world事件的时间比较长时。

那么这个时候就不是这样的,这时会输出world,再输出hello,故而我们需要callback。

在例子中我们有一个add_callback的函数,接收三个参数:前两个是要相加的两个参数,第三个参数是回调函数。当函数执行时,返回相加结果,并在控制台中输出'call 20'。

1.回调函数必须有关键词 CALLBACK;
2.回调函数本身必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数
3.回调函数并不由开发者直接调用执行(只是使用系统接口API函数作为起点)
4.回调函数通常作为参数传递给系统API,由该API来调用
5.回调函数可能被系统API调用一次,也可能被循环调用多次

如何写JavaScript中的callback回调函数

 如何写回调函数? 

如果自己在写一个方法或函数,你有可能会遇到需要一个回调函数。下面就是一个简单的常见回调函数例子:

function mySandwich(param1, param2, callback) {  
    alert(\'Started eating my sandwich.\\n\\nIt has: \' + param1 + \', \' + param2);  
    callback();  
}  

//调用该方法函数  
mySandwich(\'ham\', \'cheese\', function() {  
    alert(\'Finished eating my sandwich.\');  
});  

我们有一个叫mySandwich的函数,它接受三个参数。第三个参数就是回调函数。当执行这个方法的时候,它会弹出
一个对话框,然后才执行回调函数。注意这里第三个参数是一段函数声明,这段声明在mySandwich里面被执行。
这个参数就是回调函数。
这个回调函数是定义在第三个参数被传入的,而且里面有一个alert来告诉这个函数被执行了。

让回调函数成为可选? 

有一件事也许大家都知道,就是JQuery中的回调函数都是可选的,这就意味着如果一个方法接受回调函数,
当我们不传值给这个回调函数,它应该不会报错。但是在我们的下面例子里,如果没有传参:

function mySandwich(param1, param2, callback) {  
    alert(\'Started eating my sandwich.\\n\\nIt has: \' + param1 + \', \' + param2);  
    callback();  
}  

//调用该方法函数  
mySandwich(\'ham\', \'cheese\');  

控制台会报错:“undefined is not a function” 。

为了让它不报错就有如下代码

function mySandwich(param1, param2, callback) {  
    alert(\'Started eating my sandwich.\\n\\nIt has: \' + param1 + \', \' + param2);  
    if (callback) {  
        callback();  
    }  
  //此处的代码还可以用下面的方法表示
  //callback && callback();

}  
 
//调用该方法函数 
mySandwich(\'ham\', \'cheese\'); 

 

现在我们检测了回调函数是否传入了,就不会报错了

让回调函数必须是一个Function?

如果你想让第三个参数无论如何都要传一个Functon,可以按下方法实现:

function mySandwich(param1, param2, callback) {  
    alert(\'Started eating my sandwich.\\n\\nIt has: \' + param1 + \', \' + param2);  
    if (callback && typeof(callback) === "function") {  
        callback();  
    }  
}  

//调用该方法函数  
mySandwich(\'ham\', \'cheese\', \'vegetables\');  

注意这里用到typeof运算符,来确保传入值是一个方法,如果不是就会抛异常。

对于延时的注意

尽管回调函数总是最后被执行,但这不总是这样的。举个例子,如果含有回调函数里有一个异步的方法调用(AJAX or an animation),这时候回调会在异步方法调用后执行,但也可能在异步方法返回之前返回。

下面就是一个JQuery animate例子:

function mySandwich(param1, param2, callback) {  
    alert(\'Started eating my sandwich.\\n\\nIt has: \' + param1 + \', \' + param2);  
    
    $(\'#sandwich\').animate({  
        opacity: 0  
    }, 5000, function() {  
        // Animation complete.  
    });  
    
    if (callback && typeof(callback) === "function") {  
        callback();  
    }  
}  

//调用该方法函数  
mySandwich(\'ham\', \'cheese\', function() {   
    alert(\'Finished eating my sandwich.\');  
}); 

尽管回调在异步函数调用之后执行,但是在异步函数返回之前,回调函数就已经结束了。为了解决这种问题,我建议把回调
函数放入animate的回调函数里面。虽然这不能覆盖所有的方法,但是回调函数最基本的意义就在于最后执行。

 

参考原文:

https://www.cnblogs.com/Alex--Yang/p/3579432.html

以上是关于回调函数——callback的主要内容,如果未能解决你的问题,请参考以下文章

JS中的 回调函数(callback)

js回调函数(callback)理解

关于js的callback回调函数的理解

JavaScript系列之回调函数callback

Java 回调函数callback 用法

如何写JavaScript中的callback回调函数