279 闭包 :理解闭包,常见的闭包,闭包的作用,闭包的生命周期,闭包应用(模块化、循环遍历加监听、JS框架),闭包的缺点及解决方案,练习题

1、理解

  • 当嵌套的内部函数引用了外部函数的变量时,就产生了闭包
  • 通过chrome工具得知: 闭包本质是内部函数中的一个对象, 这个对象中包含引用的变量属性

01_理解闭包





    
    01_理解闭包



    
    



02_常见的闭包





    
    02_常见的闭包




    
    



2、作用

  • 延长局部变量的生命周期
  • 让函数外部能操作内部的局部变量

03_闭包的作用





    
    03_闭包的作用




    
    




3、闭包的生命周期





    
    04_闭包的生命周期




    
    


4、写一个闭包程序

function fn1() {
  var a = 2;
  function fn2() {
    a++;
    console.log(a);
  }
  return fn2;
}
var f = fn1();
f();
f();

5、闭包应用

  • 循环遍历加监听
  • 模块化: 封装一些数据以及操作数据的函数, 向外暴露一些行为
  • JS框架(jQuery)大量使用了闭包

循环遍历加监听





    
    00_引入




    
    
    
    
    



05_闭包的应用_自定义JS模块





    
    05_闭包的应用_自定义JS模块



    
    
    



myModule.js

function myModule() {
    //私有数据
    var msg = 'haha'
        //操作数据的函数
    function doSomething() {
        console.log('doSomething() ' + msg.toUpperCase())
    }

    function doOtherthing() {
        console.log('doOtherthing() ' + msg.toLowerCase())
    }

    //向外暴露对象(给外部使用的方法)
    return {
        doSomething: doSomething,
        doOtherthing: doOtherthing
    }
}

05_闭包的应用_自定义JS模块2





    
    05_闭包的应用_自定义JS模块2



    
    
    



myModule2.js

(function() {
    //私有数据
    var msg = 'haha'
        //操作数据的函数
    function doSomething() {
        console.log('doSomething() ' + msg.toUpperCase())
    }

    function doOtherthing() {
        console.log('doOtherthing() ' + msg.toLowerCase())
    }

    //向外暴露对象(给外部使用的方法)
    window.myModule2 = {
        doSomething: doSomething,
        doOtherthing: doOtherthing
    }
})()

6、闭包的缺点及解决方案

  • 变量占用内存的时间可能会过长
  • 可能导致内存泄露 【白白占用内存】
  • 解决:
    • 及时释放 : f = null; //让内部函数对象成为垃圾对象

06_闭包的缺点及解决





    
    06_闭包的缺点及解决



    
    



闭包练习题





    
    07_练习题1




    






    
    07_练习题2




    


你可能感兴趣的:(279 闭包 :理解闭包,常见的闭包,闭包的作用,闭包的生命周期,闭包应用(模块化、循环遍历加监听、JS框架),闭包的缺点及解决方案,练习题)