js--闭包

174 阅读2分钟

闭包

闭包基础

* 就是一个函数,能够访问其他函数内部变量的函数
function outer() {
     var  a = '变量1'
     var  inner = function () {
            console.info(a)
     }
     return inner    // inner 就是一个闭包函数,因为他能够访问到outer函数的作用域,如:a
}
var  inner = outer()   // 获得inner闭包函数
inner()   //"变量1"

当程序执行完var inner = outer(),其实outer的执行环境并没有被销毁,因为他里面的变量a仍然被inner函数作用域链所引用,当程序执行完inner(), 这时候,inner和outer的执行环境才会被销毁调;

闭包的作用

  • 访问其他函数内部变量
  • 保护变量不被内存回收机制回收
  • 避免全局变量被污染 方便调用上下文的局部变量 加强封装性

闭包的缺点

  • 闭包会引起内存泄露

由于闭包会将它的外部函数的作用域也保存在内存中,因此会比其他函数更占用内存,过度使用闭包,就会有内存泄露的威胁。

  • 如何避免闭包引起的内存泄漏
    • 1.在退出函数之前,将不使用的局部变量赋值为null;
    • 2.避免变量的循环赋值和引用。
    • 3.利用Jquery释放自身指定的所有事件处理程序。
//这段代码会导致内存泄露
window.onload = function(){
    var el = document.getElementById("id");
    el.onclick = function(){
        alert(el.id);
    }
}
//解决方法为
window.onload = function(){
    var el = document.getElementById("id");
    var id = el.id;//2.解除循环引用
    el.onclick = function(){
        alert(id); 
    }
    el = null; //1.将闭包引用的外部函数中活动对象清除
}

闭包总结

  • 闭包就是一个函数,它可以访问其他函数的内部变量
  • 内部函数引用了父级作用域的变量,即使父级上下文已经被销毁了(常规理解就是函数调用栈释放,函数内的临时变量被回收等),内部函数依旧可以读取创建它的函数的内部变量,造成内存无法释放,所以闭包会引起内存泄漏。
  • 避免闭包引起的内存泄漏,我们可以在退出函数之前,将不使用的局部变量赋值为null。