新手方法:什么是javascript回调函数?

时间:2010-08-19 15:52:54

标签: javascript callback

只是一个在调用它的另一个函数之后执行的函数,完成了吗?

请知道(几乎)关于编程的内容,我发现很难找到合适的新手答案或解释这意味着什么。

我可以从stackoverflow专家请求尝试吗?

7 个答案:

答案 0 :(得分:12)

通常,一旦您调用完成的另一个函数(就像您在问题中所述),就会使用回调函数。一个很好的例子是AJAX请求:大多数库都有一个函数,允许您在后台向服务器发送请求而不刷新页面(这使用AJAX)。您通常为此AJAX函数提供两个回调函数:成功函数和失败函数。

如果此请求成功,它将调用success函数,以便您的代码可以执行所需的操作;例如,它可能刷新部分页面,执行某种动画,或提醒用户他们的信息已保存。另一方面,如果失败,回调函数可能会提醒用户他们的数据没有保存,他们应该再试一次。

回调函数允许库开发人员创建其他人可以使用的非常通用的代码,然后根据他们的需要进行自定义。

下面是一些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);
  } 
);

编辑:一开始,我说,“总的来说......”。实际上,回调的使用不仅仅是在函数完成时。如同在其他答案中所述,它可以在函数内的任何地方使用:开始,中间,结束。基本思想是代码开发人员可能不知道您将如何使用HIS代码。因此,他使它非常通用,并使您能够使用数据做任何您需要的事情。

一个很好的例子是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方法,并允许我们为每个被调用的链接做任何我们想做的事。

答案 1 :(得分:7)

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

这是一篇很好的文章,可以帮助您理解什么是"callback" function.

答案 2 :(得分:3)

回调只是您指定的函数,不是立即调用,而是通常在某个事件之后调用。这可能类似于ajax请求,您将指定仅在成功完成ajax请求时调用并且不会出错的回调。另一个例子是当网页中的DOM准备就绪或窗口加载时的回调。

答案 3 :(得分:2)

想象一下,你有一些复杂的代码,正好在它的中间,你必须做“某事”。问题:您不知道“某些东西”可能是什么,因为这取决于代码的使用方式。回调救援。

您只需在其中进行回调,而不是使用代码。用户可以提供自己的代码,它将在合适的时间执行,以执行一些关键的操作。示例:jQuery.filter(callback)

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

通过这种方式,我们拥有两个世界中最好的一个:jQuery的聪明人创建过滤器,然后说出究竟要查找的内容。

答案 4 :(得分:1)

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


修改

实施例: 你想做一个ajax调用(例如获取一个页面)。 并且你想在下载完成时运行一些功能

使用jquery,您可以使用:

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

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

答案 5 :(得分: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是回调函数。我可以替换任何我想要的功能。

答案 6 :(得分:0)

像这样的代码

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

您的软件什么都不做,您只是在等待数据库响应。这会以某种方式阻止整个过程或暗示多个执行堆栈。但是像这样的一行代码

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

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

  

在此执行中,服务器发出该请求并继续执行其他操作   事情,当请求回来时(经过数百万个时钟周期),   你可以执行回调,你只需要指向的回调   回调。