一个函数在被另一个函数调用并完成后执行的函数,就是回调函数吗?
请注意,我对编程几乎一无所知,很难找到一个适当的新手答案或解释来说明这意味着什么。
我可以向stackoverflow大神们请求帮助吗?
一个函数在被另一个函数调用并完成后执行的函数,就是回调函数吗?
请注意,我对编程几乎一无所知,很难找到一个适当的新手答案或解释来说明这意味着什么。
我可以向stackoverflow大神们请求帮助吗?
通常,回调函数会在你调用的另一个函数完成后被使用(就像你在问题中提到的那样)。其中一个很好的例子是AJAX请求:大多数库都有一个函数,允许您在后台发送请求到服务器而不刷新页面(这使用了AJAX)。通常,向该AJAX函数提供两个回调函数:成功函数和失败函数。
如果此请求成功,则调用成功函数以便您的代码可以执行必要的操作;例如,它可能会刷新页面的某一部分、执行某种动画,或者通知用户其信息已保存。另一方面,如果失败,则回调函数可能会警告用户其数据未保存,并建议重试。
回调函数允许库开发者创建非常通用的代码,其他人可以使用并根据需要自定义。
以下是一些jQuery代码,展示了上述示例(由于URL不存在,此代码不能正常工作):
jQuery.ajax(
url: '/mywebsite/somepage.php',
success: function itWorked(returnedData) {
// This is the success function and will be called only if the ajax call
// completes succesfully
alert('Yay it worked! ' + returnedData);
},
error: function itFailed(originalRequest, textStatus, errorThrown) {
// This is the error function and will only be called if the ajax call
// has an error
alert('It failed! ' + textStatus + '. ' + errorThrown);
}
);
编辑: 在一开始,我说过:"通常情况下......"。但实际上,回调函数不仅仅用于函数完成时。正如其他答案所述,它可以在函数的任何位置使用,包括开始、中间和结尾。基本思想是代码开发者可能不知道你将如何使用他的代码。因此,他将代码设计得非常通用,并赋予你对数据进行任何必要操作的能力。
一个很好的例子是jQuery.each方法,它允许您传递一个回调函数,在“数组”中的每个元素上执行该函数(我之所以说“数组”,是因为它实际上可以迭代许多可能是实际数组的东西)。
<a href='someurl.html' class='special_link'>Some URL</a>
<a href='anotherurl.html' class='special_link'>Another URL</a>
<a href='onelasturl.html' class='special_link'>One Last URL</a>
// The following code says: execute the myEachCallbackFunction on every link
// that has a class of 'special_link'
$('a.special_link').each(function myEachCallbackFunction(i) {
// The link variable will contain the object that is currently
// being iterated over. So, the first time through, it will hold
// the 'someurl.html' link, the second time it will hold the
// 'anotherurl.html' link, and the last time it will hold the
// 'onelasturl.html' link
var link = $(this);
// Change the background color of each link to be red
link.css('background-color', 'red');
});
因此,从这个例子中我们可以看出,jQuery的开发人员实现了.each方法,并允许我们对每个被调用的链接执行任何操作。
回调函数是“作为参数传递给其他代码的可执行代码引用或可执行代码片段。”
这里有一篇很好的文章,帮助理解什么是“回调”函数。
回调函数是指定的函数,不会立即调用,通常在某些事件之后才会被调用。例如,在ajax请求中,您可以指定一个回调函数,仅在ajax请求成功完成且没有出错时才调用它。另一个例子是当网页中的DOM准备好或窗口加载时的回调函数。
想象一下,您有一些复杂的代码,在其中间,您必须要做“某些事情”。问题是:由于这取决于代码的使用方式,您不知道“某些事情”是什么。回调函数来拯救。
不要编写代码,只需在那里放置一个回调函数。用户可以提供自己的代码,并在正确的时间执行它,以执行一些关键任务。例如:jQuery.filter(callback)
。
jQuery(您应该看看)会为列表中的每个元素调用callback
。然后,回调函数可以检查元素并返回true
,如果符合某些条件,则匹配。
这样,我们就拥有了最好的两个世界:jQuery的聪明人创建了过滤器,而您说出了确切要查找的内容。
编辑
示例: 您想发起一个 ajax 调用(例如获取页面)。 并且您想在下载完成时运行一些函数时。
使用 jQuery,您可以使用以下代码:
$.get('PageIWant.html', myCallBack);
function myCallBack (data){
alert('I have got the page!');
}
function doMath (x,y,myMath) {return myMath(x,y);}
function mult (a,b){return a*b;}
function sum (a,b){return a+b;}
alert(doMath(2,2,sum))
其中 myMath 是回调函数。我可以将其替换为任何我想要的函数。
像这样的代码
var result = db.query('select * from T'); //use result - Standard function
你的软件没有任何反应,只是在等待数据库的响应。这会阻塞整个进程或者意味着多个执行堆栈。但是像这样的一行代码
db.query('select * from T',function(result){
//use result - Callback function
});
允许程序立即返回事件循环。
在此执行中,服务器发出该请求并继续执行其他操作,当请求返回(经过数百万个时钟周期)时,您可以执行回调,所需的只是回调指针。