JS回调函数全解析教程

非著名魔兽解说 发布于 2016/09/02 14:13
阅读 437
收藏 0

Linux基金会开源软件大学开源技术公开课即将上线,Kubernetes1.19实战讲解!>>>

    自学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();}就失去了变量的灵活性。>

下面用代码来证实我的理解。


  1. <html>   
  2.    
  3. <head>   
  4.    
  5. <title>回调函数(callback)</title>   
  6. <script language="javascript" type="text/javascript">   
  7. function a(callback)   
  8. {      
  9.    alert("我是parent函数a!");   
  10.     alert("调用回调函数");   
  11.     callback();   
  12. }   
  13. function b(){   
  14. alert("我是回调函数b");   
  15.   
  16. }   
  17. function c(){   
  18. alert("我是回调函数c");   
  19.   
  20. }   
  21.   
  22. function test()   
  23. {   
  24.     a(b);   
  25.    a(c);   
  26. }   
  27.   
  28. </script>   
  29. </head>   
  30.    
  31. <body>   
  32. <h1>学习js回调函数</h1>   
  33. <button onClick=test()>click me</button>   
  34. <p>应该能看到调用了两个回调函数</p>   
  35. </body>   
  36.    
  37. </html>  

加载中
0
oj8kay
oj8kay
这里是问答区,不是教程区。。发错地方了
oj8kay
oj8kay
回复 @tcxu : 为毛纠结这玩意。。。回调函数也是个函数,无非就是传个函数引用进去,对方想什么时候调用就什么时候调用
tcxu
tcxu
"楼主提到的 jquery 网站上 有关 回调函数 callback 的英文定义,要求 回调函数必须在主调函数执行完成之后,才能执行,这可能专指 jquery 编程的个别情况"。你看,这样说对吗?
0
tcxu
tcxu

    楼主提到的 jquery 网站上 有关 回调函数的英文定义,要求 回调函数必须在主调函数执行完成之后,才能执行,这可能专指 jquery 编程的个别情况。实际上,主调(父)函数可以安排 回调(被调)函数 在任意合适的时间执行,不一定必须在主调(父)函数执行完成之后再执行。
请看 百科全书 为 计算机科学/计算机编程 定义的回调函数(callback) 如下:
    In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. 
我的翻译: 
    计算机编程的回调函数/方法,是一段可执行的代码,以参数形式传递给其它函数/方法,并且预期这段可执行的代码会在某个适宜的时刻被调用执行,这就叫做回调(函数/方法)。

0
tcxu
tcxu

    楼主所列的回调函数的英文定义,似乎只是针对 jquery 网站上的个例而言成立。这个定义对一般的计算机编程,并不适用。以下案例表明,即便按楼主的设计,将回调(callback)函数放到parent函数的最后一行,它也不会一直等到parent函数(a)的代码都执行完成之后,才执行 回调函数 的代码。此处,我故意设置 函数 a 的代码要 3 秒钟才能完成。结果,尽管已经将 回调函数置于最后一行代码,回调函数还是不等 parent 函数的代码执行完毕,就率先执行完了。 渲染网页的过程,是率先显示兰色 backcall 的信息,之后2-3秒,才显示红色 执行 parent 函数代码的信息。 

<html>      
<head>     
<title>调用(call)/回调函数(callback)</title> 
<style>
#main{
	width:580px;
	height:30px;
	font-size:18px;
	font-weight:bold;
	color:#F00;
	border:solid #0F0 medium;
}
#back{
	width:580px;
	height:30px;
	font-size:18px;
	font-weight:bold;
	color:#00C;
	border:solid #0F0 medium;
}
</style> 
</head>     
<body>   
<pre style="font-weight:bold">
function a(callback){   
	setTimeout(function(){ 
		document.getElementById('main').innerHTML = 
		"主调 parent 说: Hello World。 我在回调函数的前边一行代码里 。";
		console.log("主调 parent 说: Hello World。 我在回调函数的前边一行代码里 。")
		},3000);
	callback.call(this);
}
function b(){
	document.getElementById('back').innerHTML = 
	"回调 说 : Hello Parent。我在最后的一行代码里。 "; 
	console.log("回调 说 : Hello Parent。我在最后的一行代码里。 ");
}
a(b);
</pre>  
<table>
<tr><td>Parent</td><td  id="main"></td> </tr>
<tr><td>backcall</td><td id="back"></td></tr>
</table>
</body> 
<script language="javascript" type="text/javascript">   

function a(callback){   
	setTimeout(function(){ 
	document.getElementById('main').innerHTML = 
	'主调 parent 说: Hello World。 我在回调函数的前边一行代码里 。  ';
	console.log('主调 parent 说: Hello World。 我在回调函数的前边一行代码里 。  ')
	},3000);
	callback.call(this);
}
function b(){
	document.getElementById('back').innerHTML = 
	"回调 说 : Hello Parent。我在最后的一行代码里。 "; 
	console.log("回调 说 : Hello Parent。我在最后的一行代码里。 ");
}
a(b);
</script>      
</html> 

 

返回顶部
顶部