一、閉包的定義确憨。
有很多不同的人都對閉包過進行了定義驹碍,這里收集了一些。
# 是引用了自由變量的函數(shù)坏瘩。這個函數(shù)通常被定義在另一個外部函數(shù)中,并且引用了外部函數(shù)中的變量媳板。 -- <<wikipedia>>
# 是一個可調(diào)用的對象桑腮,它記錄了一些信息,這些信息來自于創(chuàng)建它的作用域蛉幸。-- <>
# 是一個匿名的代碼塊,可以接受參數(shù)丛晦,并返回一個返回值奕纫,也可以引用和使用在它周圍的,可見域中定義的變量烫沙。--?Groovy?['ɡru:vi]
# 是一個表達式匹层,它具有自由變量及邦定這些變量的上下文環(huán)境。
# 閉包允許你將一些行為封裝锌蓄,將它像一個對象一樣傳來遞去升筏,而且它依然能夠訪問到原來第一次聲明時的上下文。
# 是指擁有多個變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù))瘸爽,因而這些變量也是該表達式的一部分您访。
# 閉包是可以包含自由(未綁定)變量的代碼塊;這些變量不是在這個代碼塊或者任何全局上下文中定義的剪决,而是在定義代碼塊的環(huán)境中定義灵汪。
在這些定義中都有一些關(guān)鍵字:變量、函數(shù)柑潦、上下文等享言,閉包在回調(diào)函數(shù)、函數(shù)式編程渗鬼、Lambda表達式中有重要的應(yīng)用览露,為了更深刻的理解閉包,我們會試圖通過JavaScript譬胎、C#和JAVA的代碼進行舉例差牛,不過本次的重點還是通過JAVA如何這內(nèi)部類來實現(xiàn)閉包,以及閉包的應(yīng)用银择。
二多糠、示例
void?fun1(){
? ? final?String s="完事了";
? ? fun2(new?ICellBack(){
? ? ? ? ? ?@Override
? ? ? ? ? ? public?void?cellBack() {
? ? ? ? ? ? ?System.out.println(s);
? ? ? ? ? ? }
? ? });
}
void?fun2(ICellBack iCellBack){
? ? //做一些事情
? ? iCellBack.cellBack();
}