我的理解就是把內部函數、變量什麼的暴露出去,使在外部可訪問。閉包至少有兩個函數,一個外部函數,一個內部函數
紅皮書中關於閉包講的很詳細,看過了在這裏作個記錄:html
閉包只能取得包含函數中任何變量的最後一個值,由於閉包所保存的是整個變量,而不是某個特殊變量es6
function creatFunctions(){ var result=new Array() for(var i=0;i<10;i++){ result[i]=function(){ return i } } return result; }
這段代碼返回的每一個值是10,而不是看起來的1,2,3........,再看下面的代碼:數組
function creatFunctions(){ var result=new Array() for(var i=0;i<10;i++){ result[i]=function(num){ return function(){ return num } }(i) } return result; }
發現不一樣了麼,第二段代碼中不是把閉包賦值給數組,而是定義一個匿名函數,傳入參數,並當即執行。由於函數參數是按值傳遞,這樣就能夠遍歷出1,2,3........閉包
this的問題看了好久,也看了不少次,這裏結合閉包說一下
注意:在全局函數中,this等於window,當函數被當作某個對象的方法調用時,this等於那個對象函數
var name="The Window" var object={ name:"hello", getNameFunc:function(){ return function(){ return this.name } } } alert(object.getNameFunc()())
在調用object.getNameFunc()()時,是兩個括號,此時彈出的是The Window,猜猜爲何?
若是去掉括號,變成alert(object.getNameFunc())此時彈出的是
this
對,就是把裏面的內容打印出來了,並無調用。內部函數在搜索this和arguments時,只會搜索到活動對象爲止,所以這裏永遠不能打印出hello,能夠把代碼作這樣的修改spa
getNameFunc:function(){ var _this=this return function(){ return _this.name } }
這樣就能當問到hello,_this是咱們在包含函數中特地聲明的一個變量,因此閉包也能夠訪問
注:用es6的箭頭函數也能夠解決這個問題code
所謂的內存泄漏,是指IE9以前的版本對JScript對象和COM對象使用不一樣的垃圾收集歷程,因此閉包在IE的這些版本中可能致使一些特殊的問題,這是能夠解決的。
好比閉包的做用域中保存html元素時,覺得這鈣元素將沒法被銷燬,這時,能夠把該對象的副本,加入是element.id保存在變量中,而後閉包結束時,把element=null置爲空htm
謹記:閉包會應用包含函數的整個活動對象對象