回调函数
说明:代码执行时并没有调用,而是在后面某一个时段回过头来调用。
1.传递函数作为回调:函数是一个对象,函数可以作为参数传递。
function fn(a, b, callback){
var num =a+b;
callback(num);
}
fn(10, 20, function(num){
console.log("Callback:" + num);
});
2.AJAX
function ajax(json) {
var type = json.type;
var url = json.url;
var success = json.success;
var fault = json.fault;
var ajax;
if (window.XMLHttpRequest) {
ajax = new XMLHttpRequest()
} else {
ajax = new ActiveXObject("Microsoft.XMLHTTP")
}
ajax.open(type, url, true);
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.status == 200 && ajax.readyState == 4) {
success(ajax.responseText);
}else{
fault();
}
}
}
//调用
ajax({
type:"Get",
url:"user.json",
success:function(a){
console.log(a) //后输出
}
});
console.log("abc") //先输出
AJAX使用的是异步处理,当开始请求的时候,就告诉它们完成的时候应该调用的函数。所在在使用的时候,当把函数分配onreadystatechange的时候,不会立即执行。
上述的例子中,下面的abc先输出,因为回调函数直到完成请求的时候才执行。
回调函数什么时候执行?
一般在同步情境下是最后执行,而在异步情境下有可能不执行,因为事件没有被触发或者条件不满足。
回调函数的使用场合
DOM事件,Node.js事件(分层回调),setTimeout。
闭包
作用:延长局部变量的作用域。
function foo(){
var a = 10;
return function(){
a *= 2;
console.log(a);
};
}
var fn = foo();
fn(); // 20.
fn(); // 40.
本来foo调用完成之后,变量a应该被销毁。
但是fn被定义在foo中,它就可以访问foo中定义的所有变量,即使是foo的执行已经结束,但是它的作用域被保存了,但是只用这个return的函数才能访问这个保存下来的作用域。
闭包的缺点:滥用的话会占用内存,影响性能。