閉包是指有權訪問另外一個函數做用域中的變量的函數。建立閉包的常見方式就是在一個函數內部建立另外一個函數。segmentfault
說明:變量分爲全局變量的局部變量,全局變量的做用域爲全局做用域,局部變量做用域爲局部做用域。以前一篇文章關於做用域鏈給了介紹,能夠在函數內部訪問全局變量,可是沒法在全局環境中訪問函數內部的變量。
那若是想在全局環境中訪問函數內部變量呢?這時候就可使用閉包。
閉包有兩個最大的用處,一個是能夠在全局做用域中讀取內部函數的的變量,另外一個就是可讓閉包中引用的變量始終保存在內存中。
如下純屬我的理解,有不一樣意見歡迎在留言區討論哈。
若是閉包單純只是爲了外部函數能夠讀取內部函數的變量,咱們也能夠經過對象將想要訪問的變量輸出就能夠,以下所示:閉包
可是閉包的另外一個目的主要是爲了讓閉包中引用的變量始終保存在內存中,以下圖所示,調用nAdd函數修改n的值,能夠發現使用閉包的函數中n的值+1:函數
緣由:當外部函數f2()執行完畢後,其活動對象也不會被銷燬,由於匿名函數result2的做用域鏈仍然在引用這個活動對象。換句話說,當f2()函數返回後,其執行環境的做用域鏈會被銷燬,但它被result2引用的活動對象(變量)仍然會留在內存中,直到result2被銷燬,f2被引用的變量才能被回收。spa
因爲閉包會攜帶包含它的函數的做用域,所以會比其餘函數佔用更多的內存。所以能夠手動解除對匿名函數的引用,以便釋放內存。code
function f2(){ var n=22; var nAdd=function(){n++}; return function(){ return { n:n, nAdd:nAdd } } } //result2就是建立了一個匿名函數 var result2=f2(); //調用函數 console.log(result2()); result2().nAdd(); console.log(result2()); //解除對匿名函數的引用,以便釋放內存 result2=null;