自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗。迅速google之,发现原来中文翻译成回调。也就是回调函数了。不懂啊,于是在google回调函数,发现网上的中文解释实在是太“深奥”了,我承认自己才疏学浅了。看了几个回调的例子后,貌似有点理解了。下面是我对回调函数的理解,要是理解错了,请指正,不甚感激。
首先还是从jquery网站上的英文定义入手,身为国人,我真感到悲剧。一个回调的定义被国内的“高手”解释成什么样,就在那绕圈子,貌似只有把你绕进去了,他才算高手。浮云,一切都是浮云。
A callback is a function that is passed as an argument to another function and is executed after its parent function has completed.
这是js里的解释了,其他语言的算我没说。
字面上理解下来就是,回调就是一个函数的调用过程。那么就从理解这个调用过程开始吧。函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。
其实中文也很好理解:回调,回调,就是回头调用的意思。函数a的事先干完,回头再调用函数b。
举个现实的例子:约会结束后你送你女朋友回家,离别时,你肯定会说:“到家了给我发条信息,我很担心你。”对不,然后你女朋友回家以后还真给你发了条信息。小伙子,你有戏了。
其实这就是一个回调的过程。你留了个函数b(要求女朋友给你发条信息)给你女朋友,然后你女朋友回家,回家的动作是函数a。她必须先回到家以后,函数a的内容执行完了,再执行函数b,然后你就收到一条信息了。
这里必须清楚一点:函数b是你以参数形式传给函数a的,那么函数b就叫回调函数。
也许有人有疑问了:一定要以参数形式传过去吗,我不可以直接在函数a里面调用函数b吗?确实可以。求解中。
<解惑:如果你直接在函数a里调用的话,那么这个回调函数就被限制死了。但是使用函数做参数就有下面的好处:当你a(b)的时候函数b就成了回调函数,而你还可以a(c)这个时候,函数c就成了回调函数。如果你写成了function a(){...;b();}就失去了变量的灵活性。>
下面用代码来证实我的理解。
以上是大神的观点,下面是我自己的补充:
首先了解一下匿名函数
为什么要创建匿名函数呢?在什么情况下会使用到匿名函数。匿名函数主要有两种常用的场景,一是回调函数,二是直接执行函数。
回调函数,像ajax的异步操作,就需要回调函数。这里就不详解。关于直接执行函数,我看一个例子就明白了:
var a = "a";
(function(){
var a="b";
alert(a);
})();
alert(a);
</script>
匿名函数的调用
要调用一个函数,我们必须要有方法定位它,引用它。所以,我们会需要帮它找一个名字。例如:
return x+y;
}
alert(abc(2,3)); // "5"
对匿名函数的调用其实还有一种做法,也就是我们看到的jQuery 片段—— 使用() 将匿名函数括起来,然后后面再加一对小括号(包含参数列表)。我们再看一下以下例子:
alert((new Function("x","y","return x*y;"))(2,3));// "6"
一、为什么要使用回调函数
1、math函数要实现bb、cc、dd中函数一个功能,每次都得改函数名字
2、比如说math函数要实现bb、cc、dd中的至少两个函数的功能,那么又得在写一个math1函数去调用另一个函数
解决:把一个函数的指针(函数名)作为另一个函数的参数,这时候调用math函数只需要传入不同的函数指针就能调用不同功能的函数
二、简单的回调函数(即:没有使用函数指针,在一个函数中调用执行另一个函数)
三、
1、有函数名的函数,函数名作为函数指针,上面大神已经讲了;
2、匿名函数代替函数指针
由于匿名函数没有函数,匿名函数的整体函数代码就相当于一个函数指针,所以匿名函数就不需要单独定义,调用父函数的时候代替函数指针作为参数,而且这样匿名函数代码出现就是已经定义这个匿名函数
- function aa(callback){
- alert("我是父函数");
- alert("执行回调函数");
- callback();
- }
- aa(function(){
alert("我是回调函数");
})
3、定义父函数同时执行父函数
-
alert( (function aa(num1,num2,fun){
return fun(num1,num2)
})(2,3,function (num1,num2){return (num1+num2)*2}) )
关于模拟jquery封装ajax请求中回调函数的分析:(day23_3)
把ajax请求封装为一个工具文件ajaxutils.js,即封装ajax请求方法
下面ajax函数就相当于一个父函数,参数是option(json数据对象:是URL,callback回调函数作为参数等参数的封装体)
1、定义的函数 匿名函数作为函数参数
data获得服务器响应的文本数据,在调用回调函数作为实参传递给在json3.jsp中定义的回调函数的形 参
2、Json3.jsp调用父函数ajax(option),同时定义一个匿名函数代替函数指针作为形参
jQuery中回调函数什么时候执行
this(特别注意回调函数中this代表谁)
day44_jquery/ajax/ex01/user.js
下面回调函数在click这个函数内部执行,这里click函数是jquery内部的函数
在回调函数内部写一个this,即:在click函数的内部,谁调用回调函数,this就代表谁
关于原始封装ajax请求封装,回调函数里面的this分析
1、定义封装ajax请求的函数(参数一个json对象)
2、调用ajax封装函数(匿名函数在此时定义,匿名函数没有函数指针 即:函数名,
所以定义的时候,就把自己作为替换函数指针作为实参传给调用ajax封装函数)
因为上面定义ajax函数形参为ajaxJSON对象,把所有参数作为json对象封装,
当ajax函数自己部分执行,调用上面回调函数部分,是json对象调用了回调函数
3、post方法中的回调函数
下面是post的方法调用,post方法定义在jquery内核
$delA触发click事件,调用回调函数
观点:上面的ajax函数把所有参数都封装到json对象中
要取出回调函数,必须使用json对象去区
而post中回调函数单独定义的,且定义的同时也作为参数
在一个函数中调用另一个函数是通过:函数指针();
且一个A函数里面的实参函数给这个定义的A函数的的形参,在通过定义的A函数里面的变量接收使用,所以没有json对象还A这个函数调用了实参
这把匿名函数传给callback(data),还在post函数里面进行,把匿名函数给了callback,后面()就代表运行匿名函数
这里也就跟在一个函数调用另一个函数一样,凡事定义的函数,都能在里一个函数中调用,不管这个函数定义在哪,这里定义的函数只不过定义在了作为参数的地方,为什么也定义在一个函数的参数位置?匿名函数作为回调函数,我觉得方便使用,定义的同时又代替函数指针作为参数,因为没有函数名,定义的时候刚好也把它用了
不是匿名函数作为回调函数,一个math在一个js文件中重复实现多个功能使用回调函数
1、math函数要实现bb、cc、dd中函数一个功能,每次都得改函数名字
2、比如说math函数要实现bb、cc、dd中的至少两个函数的功能,那么又得在写一个math1函数去调用另一个函数
解决:把一个函数的指针(函数名)作为另一个函数的参数,这时候调用math函数只需要传入不同的函数指针就能调用不同功能的函数