什么是闭包

浅显的从用法上理解

  • 既重用变量又保护变量不被污染的一种编程方法。
  • 今后:只要希望给一个函数,保存一个即可反复使用,又不会被 外界污染的专属局部变量时,就用闭包

  • 闭包也是一个对象

  • 闭包就是每次调用外层函数时,临时创建的函数作用域对象。

为什么外层函数作用域对象能留下来? 因为被内层函数对象的作用域链引用着, 无法释放

image.png
内层函数,将来迟早要被别的变量接住 所以,起不起名,结果是一样的! 那干脆我们就不起函数名了! 将来谁接住内层函数,谁负责起名。

内层函数function等于new Function() 相当于在外层函数内部创建一个新的内层函数对象 ——小宝宝**return 负责将内层函数对象(小宝宝)返回到外层函数外部——妈妈把小宝宝生出来

因为内层函数只是定义,未加()调用。 所以,内层函数中的代码不执行
因为内层函数是在外层函数内部创建的,所以内层函数的作用域链是3个格子,依次是:
• 内层函数自己的作用域对象
• 外层函数的作用域对象
• 全局作用域对象

一句话概括:
闭包如何形成 ?
外层函数调用后,外层函数的作用域对象, 被返回的内层函数的作用域链引用着, 无法释放,
就形成了闭包对象

缺点:

由于闭包藏得很深 几乎找不到 所以,极容易造成内存泄漏!

外层函数返回内层函数的方法: 3种:

  • return
  • 强行赋值为全局变量
  • 将函数包裹在对象或数组中返回

使用场景

任何闭包的使用场景都离不开这两点:

  • 创建私有变量
  • 延长变量的生命周期
  • 函数防抖
  • for循环问题
  • 用闭包定义能访问私有函数和私有变量的公有函数
  • 函数中的匿名函数

image.pngimage.png
(第二种用到外部变量,形成闭包,ret不置null,会引起内存泄露)