天天看點

閉包概念,閉包的場景?

閉包  能夠讀取其他函數内部變量的函數

例如在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

繼續閱讀