函数高级 闭包

1. 如何产生闭包?

      * 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包

2. 闭包到底是什么?

      * 使用chrome调试查看

      * 理解一: 闭包是嵌套的内部函数(绝大部分人)

      * 理解二: 包含被引用变量(函数)的对象(极少数人)

      * 注意: 闭包存在于嵌套的内部函数中

3. 产生闭包的条件?

      * 函数嵌套

      * 内部函数引用了外部函数的数据(变量/函数)

常见的闭包

    1. 将函数作为另一个函数的返回值

    2. 将函数作为实参传递给另一个函数调用

<script type="text/javascript">

  // 1. 将函数作为另一个函数的返回值

  function fn1() {

        var a = 2

        function fn2() {

          a++

          console.log(a)

        }

        return fn2

  }

  var f = fn1()

  f() // 3

  f() // 4

  // 2. 将函数作为实参传递给另一个函数调用

  function showDelay(msg, time) {

        setTimeout(function () {

          alert(msg)

        }, time)

  }

  showDelay('atguigu', 2000)

闭包的作用

1. 使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期)

2. 让函数外部可以操作(读写)到函数内部的数据(变量/函数)

问题:

          1. 函数执行完后, 函数内部声明的局部变量是否还存在?  一般是不存在, 存在于闭中的变量才可能存在

          2. 在函数外部能直接访问函数内部的局部变量吗? 不能, 但我们可以通过闭包让外部操作它

生命周期

1. 产生: 在嵌套内部函数定义执行完时就产生了(不是在调用)

2. 死亡: 在嵌套的内部函数成为垃圾对象时

闭包的应用 : 

定义JS模块

  * 具有特定功能的js文件

  * 将所有的数据和功能都封装在一个函数内部(私有的)

  * 只向外暴露一个包信n个方法的对象或函数

  * 模块的使用者, 只需要通过模块暴露的对象调用方法来实现对应的功能

闭包的缺点及解决

1. 缺点

  * 函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长

  * 容易造成内存泄露

2. 解决

  * 能不用闭包就不用

  * 及时释放

1. 内存溢出

  * 一种程序运行出现的错误

  * 当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误

2. 内存泄露

  * 占用的内存没有及时释放

  * 内存泄露积累多了就容易导致内存溢出

  * 常见的内存泄露:

    * 意外的全局变量

    * 没有及时清理的计时器或回调函数

    * 闭包

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。