博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于回调函数
阅读量:5373 次
发布时间:2019-06-15

本文共 2330 字,大约阅读时间需要 7 分钟。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

  想弄明白回调函数,首先的清楚地明白函数的规则。在javascript中,函数是比较奇怪的,但它确确实实是对象。确切地说,函数是用Function()构造函数创建的Function对象。Function对象包含一个字符串,字符串包含函数的javascript代码。假如你是从C语言或者java语言转过来的,这也许看起来很奇怪,代码怎么可能是字符串?但是对于javascript来说,这很平常。数据和代码之间的区别是很模糊的。

1
2
3
//可以这样创建函数
var
fn =
new
Function(
"arg1"
,
"arg2"
,
"return arg1 * arg2;"
);
fn(2, 3);
//6

  这样做的一个好处,可以传递代码给其他函数,也可以传递正则变量或者对象(因为代码字面上只是对象而已)。

  传递函数作为回调

  很容易把一个函数作为参数传递。

1
2
3
4
5
6
7
8
function
fn(arg1, arg2, callback){
 
var
num = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
 
callback(num);  
//传递结果
}
 
fn(10, 20,
function
(num){
 
console.log(
"Callback called! Num: "
+ num);
});    
//结果为10和20之间的随机数

  传统函数以参数形式输入数据,并且使用返回语句返回值。理论上,在函数结尾处有一个return返回语句,结构上就是:一个输入点和一个输出点。这比较容易理解,函数本质上就是输入和输出之间实现过程的映射。

  但是,当函数的实现过程非常漫长,你是选择等待函数完成处理,还是使用回调函数进行异步处理呢?这种情况下,使用回调函数变得至关重要,例如:AJAX请求。若是使用回调函数进行处理,代码就可以继续进行其他任务,而无需空等。实际开发中,经常在javascript中使用异步调用,甚至在这里强烈推荐使用!

  下面有个更加全面的使用AJAX加载XML文件的示例,并且使用了call()函数,在请求对象(requested object)上下文中调用回调函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function
fn(url, callback){
 
var
httpRequest;    
//创建XHR
 
httpRequest = window.XMLHttpRequest ?
new
XMLHttpRequest() :   
//针对IE进行功能性检测
    window.ActiveXObject ?
new
ActiveXObject(
"Microsoft.XMLHTTP"
) : undefined;
  
 
httpRequest.onreadystatechange =
function
(){
  
if
(httpRequest.readystate === 4 && httpRequest.status === 200){  
//状态判断
   
callback.call(httpRequest.responseXML);
  
}
 
};
 
httpRequest.open(
"GET"
, url);
 
httpRequest.send();
}
 
fn(
"text.xml"
,
function
(){    
//调用函数
 
console.log(
this
);   
//此语句后输出
});
 
console.log(
"this will run before the above callback."
);  
//此语句先输出

  我们请求异步处理,意味着我们开始请求时,就告诉它们完成之时调用我们的函数。在实际情况中,onreadystatechange事件处理程序还得考虑请求失败的情况,这里我们是假设xml文件存在并且能被浏览器成功加载。这个例子中,异步函数分配给了onreadystatechange事件,因此不会立刻执行。

  最终,第二个console.log语句先执行,因为回调函数直到请求完成才执行。

  上述例子不太易于理解,那看看下面的示例:

1
2
3
4
5
6
7
8
9
10
function
foo(){
 
var
a = 10;
 
return
function
(){
  
a *= 2;
  
return
a; 
 
};
}
var
f = foo();
f();
//return 20.
f();
//return 40.

  函数在外部调用,依然可以访问变量a。这都是因为javascript中的作用域是词法性的。函数式运行在定义它们的作用域中(上述例子中的foo内部的作用域),而不是运行此函数的作用域中。只要f被定义在foo中,它就可以访问foo中定义的所有的变量,即便是foo的执行已经结束。因为它的作用域会被保存下来,但也只有返回的那个函数才可以访问这个保存下来的作用域。返回一个内嵌匿名函数是创建闭包最常用的手段。

 

转载于:https://www.cnblogs.com/dh55/p/5585392.html

你可能感兴趣的文章
ubuntu中文英文环境切换
查看>>
[sql]mysql启停脚本
查看>>
[elk]Mutate filter plugin增删改查字段
查看>>
Java内功心法,行为型设计模式
查看>>
向github项目push代码后,Jenkins实现其自动构建
查看>>
jquery中的ajax方法参数的用法和他的含义
查看>>
BZOJ 1226: [SDOI2009]学校食堂Dining
查看>>
数组去重的几种方法
查看>>
包装类的自动装箱与拆箱
查看>>
ShareSDk的使用
查看>>
android使用web加载网页的js问题
查看>>
poj 1068 Parencodings
查看>>
docker 数据卷管理
查看>>
如何让一个div的大小,从某一个特定值开始,随内容的增加而自动变化?
查看>>
P1977 出租车拼车(DP)
查看>>
iOS开发--完整项目
查看>>
我的博客园皮肤模板
查看>>
正则表达式
查看>>
java基础:不同进制的表现形式
查看>>
Base64转换为blob对象
查看>>