JS闭包

所有内容均不是原创,单纯之前学习时做的笔记。内容结合了非常多的文章视频,已经记不清参考的哪里的了,所以就没有加参考说明了*。*

闭包

什么是闭包?

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的最常见的方式,一个A函数嵌套一个B函数,B函数使用A函数中的变量,我们称B函数为闭包函数。

闭包的特点是什么?

  1. 让外部访问函数内部变量成为可能
  2. 局部变量会常驻在内存中
  3. 可以避免使用全局变量,防止全局变量污染

闭包的用途?

  1. 读取函数内部的变量,让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
  2. 封装对象的私有属性和私有方法

使用闭包的注意点?

  • 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除(一般是将引用的变量设置为null)
  • 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象使用,把闭包当作它的公用方法),把内部变量当作它的私有属性),这时一定要小心,不要随便改变父函数内部变量的值。

闭包常用的使用场景?

  1. 返回值(函数作为返回值被返回)
  2. 函数赋值(将内部函数赋值给一个外部变量)
  3. 函数参数(闭包可以通过函数参数传递函数形式来实现)
  4. IIFE(函数fn()都是声明后立即被调用的,因此可以使用IIFE来替代)
  5. 循环赋值
  6. getter和setter(通过提供getter()和setter()函数来将要操作的变量保存在函数内部,防止其暴露在外部)
  7. 迭代器
  8. 区分首次
  9. 缓存机制(通过闭包加入缓存机制,使得相同的参数不用重复计算,来提高函数的性能
  10. img对象数据上报(report函数并不是每一次都成功地发起了HTTP请求,原因是img是report函数中的局部作用域,当report函数的调用结束后,img局部变量随即被销毁,而此时或许还没来得及发出HTTP请求,现在把img变量用闭包封存起来,就能解决请求丢失的问题)