一句话说清楚Javascript中的回调函数


根据我的理解,用最简单的语言描述Javascript中的回调函数是什么意思。下面用一段代码来举例子说明。

(function( callback ){
president = { name:”obama” };
callback( president );
console.log( president.name ); // bush
})(function( a ){
a.name = “bush”;
a = { name:”cliten” };
})
1、什么是回调函数?

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

2、回调函数是如何实现的?

我们可以像使用变量一样使用函数,作为另一个函数的参数,在另一个函数中作为返回结果,在另一个函数中调用它。当我们作为参数传递一个回调函数给另一个函数时,我们只传递了这个函数的定义,并没有在参数中执行它。

当包含(调用)函数拥有了在参数中定义的回调函数后,它可以在任何时候调用(也就是回调)它。

这说明回调函数并不是立即执行,而是在包含函数的函数体内指定的位置“回调”它(形如其名)。

举个例子:老师L让学生A做一件事情,就是将全班同学的试卷给学生A,让他找出其中不及格的试卷。老师L接着又找到学生B,将这部分试卷交给他,让学生B把这些同学的名字记下来。看这倒霉老师安排这事儿,一看就不懂回调,首先学生A把全班同学的试卷都翻了个遍,学生 B又将其中不及格部分同学的试卷翻个遍,实际上是多余的for循环了。如果数据量很大(全班300万学生,不及格的140万),那势必会造成多余的时间人力浪费。那怎么用回调的方式呢?学生A说了:老师你给我一个会记名字的学生B,我找到一个不及格的就把试卷给他,他记下试卷上的名字就可以了。这样的话全班同学的试卷就只被找了一遍就完成任务了。那么通过以上的例子,我们就可以把学生B看成是学生A的回调函数。学生B可以看作是老师调用学生A找不及格试卷的方法的时候传给学生A的一个参数,在学生A需要的时候就调用这个参数做事情就可以了。这就可以说是回调的方式。

3、回调函数的作用是什么?

Javascript是单线程的,也就是说js代码的执行顺序是从上到下,有时候你需要一个操作完全结束再到下一个操作,为了确保这一点就必须使用回调函数!

假如你发起一个网络请求,需要在请求到数据的时候再进行数据处理操作.如果不用回调的话,下一步操作怎么进行?如果按照一般的代码,有可能请求的数据还没返回,数据处理操作已经执行完了!

注意:上面的代码说明一个问题,也是项目开发中经常会遇到的一个坑,如果回调函数中传入的参数是一个对象,那么在回调函数内容如果要改变这个对象的值,记得要操作这个对象的某个属性,而不是对象本身,因为对象传参是传地的。