浅读回调函数,闭包

回调函数

说明:代码执行时并没有调用,而是在后面某一个时段回过头来调用。

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的函数才能访问这个保存下来的作用域。

闭包的缺点:滥用的话会占用内存,影响性能。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值