天天看点

闭包概念,闭包的场景?

闭包  能够读取其他函数内部变量的函数

例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。简单理解为定义在一个函数内部的函数,内部函数持有外部函数内变量的引用

function fn1(){
   var n = 123;
   return function fn2(){    //f2是一个闭包
       alert(n)
   }    
}
           

fn2可以读取fn1中的变量,只要把fn2作为返回值,就可以在fn1外读取fn1内部变量

闭包的用途 

  • 读取函数内部的变量
  • 让这些变量的值始终保持在内存中。不会在fn1调用后被自动清除。
  • 避免很多人在开发的时候,大家起的变量名冲突,这时候就将自己的变量放入函数中。

fn1是f2的父函数,fn2被赋给了一个全局变量,fn2始终存在内存中,fn2的存在依赖fn1,因此fn1也始终存在内存中,不会在调用结束后,被垃圾回收机制回收。

优点

  • 避免全局变量的污染
  • 能够读取函数内部的变量
  • 可以在内存中维护一个变量

缺点

  • 闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除

使用场景

  • 给对象设置私有变量并且利用特权方法去访问私有属性
function Fun(){
  var name = 'yr';
  
  this.getName = function (){
    return name;
  }
}

var fun = new Fun(); 
console.log(fun.name);//输出undefined,在外部无法直接访问name
console.log(fun.getName());//可以通过特定方法去访问
           
  • 节流防抖用到的闭包(参考)

   https://blog.csdn.net/lanseguhui/article/details/117747929?spm=1001.2014.3001.5501