闭包

1.什么是闭包?

 

函数嵌套函数,内部函数可以引用外部函数的参数和变量.参数和变量不会被垃圾回收机制所收回.

function aaa(){
        var a =5;
        function bbb(){
            alert(a);
        }
        return bbb;
    }
    var c = aaa();
    c();

 

2.闭包有什么好处?应用在哪里?

好处:

  希望一个变量长期驻扎在内存当中.

  可以避免全局变量的污染.

  私有成员的存在.

function aaa(){
    var a =1;
    return function(){
        a++;
        alert(a);
    }
}

var b= aaa();
b(); // 2
b(); //3

用法:

  模块化代码

  在循环中直接找到对应元素的索引.

//模块化代码
var aaa = (function(){
    var a =1;
    return function(){
        a++;
        alert(a);
    }
})();
aaa();//2
aaa();//3
var aaa = (function(){

    var a =1;
    function bbb(){
        a++;
        alert(a);
    }
    function ccc(){
        a++;
        alert(a);
    }
    return {
        b:bbb,
        c:ccc
    }

})();

aaa.b();//2
aaa.c();//3
//下面的三个报错
alert(a);
alert(bbb);
alert(ccc);
window.onload=function(){
    var aLi = document.getElementsByTagName('li');
    for(var i=0;i<aLi.length;i++){
        // (function(i){
        //     aLi[i].onclick = function(){
        //         alert(i);
        //     }
        // })(i);
        
        aLi[i].onclick = (function(i){
            return function(){
                alert(i);
            }
        })(i);

    }
}

 

3.闭包需要注意的地方?

IE下会引发内存泄露. fuck ie.

// window.onload=function(){
//     var oDiv = document.getElementById('div1');

//     oDiv.onclick = function(){
//         alert(oDiv.id);
//     };

//     window.onunload = function(){
//         oDiv.onclick = null;
//     }

// }

window.onload = function(){
    var oDiv = document.getElementById('div1');
    var id = oDiv.id;
    oDiv.onclick = function(){
        alert(id);
    }

    oDiv=null;
}

 

posted on 2016-12-13 10:15  夜行锦衣  阅读(84)  评论(0编辑  收藏  举报

导航