我眼中的闭包

是什么

闭包是一个特殊的对象, 函数嵌套,内部函数,引用了外部函数中的变量 产生了引用关系,此时就是闭包

  1. function fun1() {
  2. let a = 0
  3. function fun() {
  4. console.log(++a);
  5. }
  6. return fun
  7. }
  8. let fu=fun1()
  9. fu()//调用函数使用闭包

作用

函数内部的数据是私有的,但是函数每次执行他所创建的变量对象都会被销毁,利用闭包,产生的引用关系,可以延长变量对象的生命周期,
保护他内部的变量不受干扰。
通过函数返回的引用变量,间接访问函数内部数据。

  1. function fun1() {
  2. let a = 0
  3. function fun() {
  4. console.log(++a);
  5. }
  6. return fun
  7. }
  8. let fu=fun1()
  9. fu()//调用函数使用闭包 1
  10. fu()//调用函数使用闭包 2
  11. fu()//调用函数使用闭包 3
  12. fu()//调用函数使用闭包 4
  13. fu = null 切断引用使其被垃圾回收机制回收
  • 同样闭包的优点就是他的缺点,保存变量对象 需要内存,会造成内存泄漏。所以不使用时要及时清除闭包

产生

闭包是在外部函数执行时,执行内部函数定义时产生,如何是函数声明要到执行哪一行才会产生,声明的话是预解析,在堆空间中创建函数,发现他使用了外部函数的变量,就给他分配一块,外部函数变量对象的地址,
闭包 - 图1

应用

利用闭包保存循环的值

  1. for(var i = 0; i <5; i++){
  2. ((i)=>{
  3. setTimeout(() => {
  4. console.log(i);
  5. }, 0);
  6. })(i) // 利用闭包缓存i
  7. }

封装一下函数会非常有用 ,一个函数就是一个功能模块

  1. function bind(callBack,obj,...args) {
  2. return function (...arg) {
  3. return callBack.call(obj,...args,...arg)
  4. }
  5. }