官方定義
閉包指的是詞法表示包括不被計算的函數,也就是說函數可以使用函數之外定義的變量
也可以認為就是在函數中定義的函數,可以訪問外部函數,而且使用過程中,訪問的是記憶的變量,而不是當然調用時上下文的變量,有點像java中class的對象。
extjs中動態創建組件,帶有回調函數:
var menubar=Ext.GetComp("menu")
for (var i in jsonobj){
var handle=function(){
var url=jsonobj[i].url
return function{
window.location.href=url
}
}
var button={
text:windows[jsonobj[i].label],
handler:handler(),
iconCls:"icon-btn,
width:110
}
menubar.menu.addItem(button)
}
其中url變量需要用閉包記憶起來,不然實際回調函數執行的時候用的是當前上下文(本例是循環結束時的值即i+1)的變量。
閉包總結起來有兩個好處:
變量作用范圍在閉包內部,避免變量沖突,有利于面相對象設計。
記憶變量值,回調函數能找到定義時的那個變量。