深入了解闭包

70 阅读1分钟

一.闭包的概念

闭包:作用域
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰
实现信息的驻留(信息的保持,引用在,空间不销毁)
//简单的闭包
var Person = function(){
    var count = 0;  //私有变量
    return function getCount(){
        console.log(count++);  //使用闭包实现信息的驻留
    }
}
var p = new Person();
p();   //0
p();   //1
p();   //2
闭包的缺点:闭包导致内存会驻留,如果是大量对象的闭包环境注意内存消耗

二.练习题

var buttons = [{name:'b1'},{name:'b2'},{name:'b3'}];
function bind(){
    for(var i = 0,len=buttons.length;i<len;i++){
        buttons[i].onclick = function(){
            alert(i);
        }
    }
}
bind();
buttons[0].onclick();  //3
buttons[1].onclick();  //3
buttons[2].onclick();  //3  
//解决方法(输出0 1 2):
function bind(){
    for(var i = 0,len=buttons.length;i<len;i++){
        (function(num){
            buttons[i].onclick = function(){
                alert(num);
            }
        })(i)
    }
}
或者:
function bind(){
    for(let i = 0,len=buttons.length;i<len;i++){
        buttons[i].onclick = function(){
            alert(i);
        }
    }
}
ES6的let关键字也可以创建单独的作用域