什么是闭包
浅显的从用法上理解
- 既重用变量又保护变量不被污染的一种编程方法。
今后:只要希望给一个函数,保存一个即可反复使用,又不会被 外界污染的专属局部变量时,就用闭包
闭包也是一个对象
- 闭包就是每次调用外层函数时,临时创建的函数作用域对象。
为什么外层函数作用域对象能留下来? 因为被内层函数对象的作用域链引用着, 无法释放
内层函数,将来迟早要被别的变量接住 所以,起不起名,结果是一样的! 那干脆我们就不起函数名了! 将来谁接住内层函数,谁负责起名。
内层函数function等于new Function() 相当于在外层函数内部创建一个新的内层函数对象 ——小宝宝**return 负责将内层函数对象(小宝宝)返回到外层函数外部——妈妈把小宝宝生出来
因为内层函数只是定义,未加()调用。 所以,内层函数中的代码不执行
因为内层函数是在外层函数内部创建的,所以内层函数的作用域链是3个格子,依次是:
• 内层函数自己的作用域对象
• 外层函数的作用域对象
• 全局作用域对象
一句话概括:
闭包如何形成 ?
外层函数调用后,外层函数的作用域对象, 被返回的内层函数的作用域链引用着, 无法释放,
就形成了闭包对象
缺点:
由于闭包藏得很深 几乎找不到 所以,极容易造成内存泄漏!
外层函数返回内层函数的方法: 3种:
- return
- 强行赋值为全局变量
- 将函数包裹在对象或数组中返回
使用场景
任何闭包的使用场景都离不开这两点:
- 创建私有变量
- 延长变量的生命周期
- 函数防抖
- for循环问题
- 用闭包定义能访问私有函数和私有变量的公有函数
- 函数中的匿名函数
(第二种用到外部变量,形成闭包,ret不置null,会引起内存泄露)