JS闭包

1. 如何产生闭包?
  * 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包
2. 闭包到底是什么?
  * 使用chrome调试查看
  * 理解一: 闭包是嵌套的内部函数
  * 理解二: 包含被引用变量(函数)的对象
  * 注意: 闭包存在于嵌套的内部函数中
3. 产生闭包的条件?
  * 函数嵌套
  * 内部函数引用了外部函数的数据(变量/函数)
 function fn1 () {
//闭包开始产生
var a = 3 function fn2 () { console.log(a)
    a++; }
  return fn2 } var f = fn1()//外部函数使用了内部变量,外部变量一直引用着fn1
f()//3
f()//4
f()//5
f = null;//闭包死亡(引用闭包的函数对象被回收)

 闭包给window添加属性

/**
 * 自定义模块2
 */
(function (window) {
  //私有的数据
  var msg = ‘atguigu‘
  var names = [‘I‘, ‘Love‘, ‘you‘]
  //操作数据的函数
  function a() {
    console.log(msg.toUpperCase())
  }
  function b() {
    console.log(names.join(‘ ‘))
  }

  window.coolModule2 =  {
    doSomething: a,
    doOtherthing: b
  }
})(window)

向外部暴露多个函数

/**
 * 自定义模块1
 */
function coolModule() {
  //私有的数据
  var msg = ‘atguigu‘
  var names = [‘I‘, ‘Love‘, ‘you‘]

  //私有的操作数据的函数
  function doSomething() {
    console.log(msg.toUpperCase())
  }
  function doOtherthing() {
    console.log(names.join(‘ ‘))
  }

  //向外暴露包含多个方法的对象
  return {
    doSomething: doSomething,
    doOtherthing: doOtherthing
  }
}

 闭包缺点:

<!--
1. 缺点
  * 函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长
  * 容易造成内存泄露
2. 解决
  * 能不用闭包就不用
  * 及时释放
-->
<script type="text/javascript">
  function fn1() {
    var a = 2;

    function fn2() {
      a++;
      console.log(a);
    }

    return fn2;
  }
  var f = fn1();

  f(); // 3
  f(); // 4

  f = null // 释放
</script>

 

JS闭包

上一篇:js导入导出方式


下一篇:CSS样式-盒模型width和height范围分析