閉包有什么用?
簡(jiǎn)而言之,閉包就是用來(lái)延長(zhǎng)局部變量生命周期的,延長(zhǎng)的同時(shí)可以在其他位置訪問(wèn)局部變量(不能訪問(wèn)就跟沒(méi)延長(zhǎng)一樣)。
閉包的形式就是在函數(shù)中對(duì)外開(kāi)放另一個(gè)方法使得其他地方(外部和內(nèi)部皆可)可以通過(guò)此方法來(lái)訪問(wèn)這個(gè)函數(shù)的局部變量。
例如:function abc(){
?????? let a=1;
?????? return function(b){
????????????? a=b;
????????????? console.log(a);
}
}
let func = abc();
func(4);
這時(shí)候會(huì)發(fā)現(xiàn)調(diào)用abc的時(shí)候產(chǎn)生的局部變量a,在函數(shù)執(zhí)行完后并沒(méi)有銷(xiāo)毀,而是可以通過(guò)返回的方法func進(jìn)行間接的修改。類(lèi)似這種保留局部變量并讀取或修改的方式就是閉包。
下面我將列舉一種閉包的實(shí)際用途。那就是面向切面的編程,尤其是不能修改源代碼卻需要進(jìn)行一定的侵入式修改和讀取的時(shí)候。
例如你想跟蹤你的代碼的執(zhí)行過(guò)程,或者說(shuō)是保留你代碼的執(zhí)行過(guò)程然后給其他程序進(jìn)行檢測(cè)和處理,那么這里就牽涉到了局部變量的保存,最簡(jiǎn)單的方式自然就是在程序的執(zhí)行過(guò)程中加入一些代碼使得程序形成閉包,然后得到閉包訪問(wèn)函數(shù)進(jìn)行訪問(wèn),此時(shí)外部的訪問(wèn)完全不影響內(nèi)部的執(zhí)行。甚至內(nèi)部已經(jīng)執(zhí)行完成了,但是留下了一堆閉包,這時(shí)候在外部只需要使用樹(shù)的遍歷的方式即可完成訪問(wèn)。
簡(jiǎn)而言之,試想你完成了一種遞歸的算法,后來(lái)發(fā)現(xiàn)你需要獲取遞歸過(guò)程中產(chǎn)生的數(shù)據(jù),而且是直接訪問(wèn)變量而不是變量的結(jié)果,此時(shí)就不能簡(jiǎn)單的在遞歸的過(guò)程中存儲(chǔ)中間結(jié)果,而是將內(nèi)部的中間結(jié)果保存為閉包。