JavaScript回调函数是什么?初学者入门

9

一个函数在被另一个函数调用并完成后执行的函数,就是回调函数吗?

请注意,我对编程几乎一无所知,很难找到一个适当的新手答案或解释来说明这意味着什么。

我可以向stackoverflow大神们请求帮助吗?


1
看看这个答案:https://dev59.com/BnI95IYBdhLWcg3w-DHz#2070389 - Rob Hruska
7个回答

12

通常,回调函数会在你调用的另一个函数完成后被使用(就像你在问题中提到的那样)。其中一个很好的例子是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方法,并允许我们对每个被调用的链接执行任何操作。


8

回调函数是“作为参数传递给其他代码的可执行代码引用或可执行代码片段。”

这里有一篇很好的文章,帮助理解什么是“回调”函数。


1
+1 我相信这将是最完整、正确和简单的回复。就是这样。 - html_programmer

3

回调函数是指定的函数,不会立即调用,通常在某些事件之后才会被调用。例如,在ajax请求中,您可以指定一个回调函数,仅在ajax请求成功完成且没有出错时才调用它。另一个例子是当网页中的DOM准备好或窗口加载时的回调函数。


2

想象一下,您有一些复杂的代码,在其中间,您必须要做“某些事情”。问题是:由于这取决于代码的使用方式,您不知道“某些事情”是什么。回调函数来拯救。

不要编写代码,只需在那里放置一个回调函数。用户可以提供自己的代码,并在正确的时间执行它,以执行一些关键任务。例如:jQuery.filter(callback)

jQuery(您应该看看)会为列表中的每个元素调用callback。然后,回调函数可以检查元素并返回true,如果符合某些条件,则匹配。

这样,我们就拥有了最好的两个世界:jQuery的聪明人创建了过滤器,而您说出了确切要查找的内容。


1
回调函数是一种在另一个进程结束时自动调用的函数。它们在异步过程中非常有用,比如获取页面。

编辑

示例: 您想发起一个 ajax 调用(例如获取页面)。 并且您想在下载完成时运行一些函数

使用 jQuery,您可以使用以下代码:

$.get('PageIWant.html', myCallBack);

function myCallBack (data){
  alert('I have got the page!');
}

0
尝试得到一个更一般和简单的例子,我想出了以下内容,并使用参数执行两个数字x和y的计算。
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 是回调函数。我可以将其替换为任何我想要的函数。


0

像这样的代码

var result = db.query('select  * from T'); //use result - Standard function

你的软件没有任何反应,只是在等待数据库的响应。这会阻塞整个进程或者意味着多个执行堆栈。但是像这样的一行代码

db.query('select * from T',function(result){
    //use result - Callback function
});

允许程序立即返回事件循环。

在此执行中,服务器发出该请求并继续执行其他操作,当请求返回(经过数百万个时钟周期)时,您可以执行回调,所需的只是回调指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接