什么是閉包:閉包是指可以包含自由(未綁定到特定對象)變量的代碼塊寄狼;這些變量不是在這個代碼塊內(nèi)或者任何全局上下文中定義的诱咏,而是在定義代碼塊的環(huán)境中定義(局部變量)扮惦】苈“閉包” 一詞來源于以下兩者的結(jié)合:要執(zhí)行的代碼塊(由于自由變量被包含在代碼塊中遣耍,這些自由變量以及它們引用的對象沒有被釋放)和為自由變量提供綁定的計算環(huán)境(作用域)闺阱。在PHP、Scala舵变、Scheme酣溃、Common Lisp、Smalltalk纪隙、Groovy赊豌、JavaScript、Ruby绵咱、 Python碘饼、Go、Lua悲伶、objective c艾恼、swift 以及Java(Java8及以上)等語言中都能找到對閉包不同程度的支持。
閉包的優(yōu)點:
1. 邏輯連續(xù)麸锉,當閉包作為另一個函數(shù)調(diào)用的參數(shù)時钠绍,避免你脫離當前邏輯而單獨編寫額外邏輯。
2. 方便調(diào)用上下文的局部變量花沉。
3. 加強封裝性柳爽,第2點的延伸媳握,可以達到對變量的保護作用。
閉包的缺點:
閉包有一個非常嚴重的問題磷脯,那就是內(nèi)存浪費問題蛾找,這個內(nèi)存浪費不僅僅因為它常駐內(nèi)存,更重要的是争拐,對閉包的使用不當會造成無效內(nèi)存的產(chǎn)生
使用閉包的注意點:
(1)由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中腋粥,內(nèi)存消耗很大,所以不能濫用閉包架曹,否則會造成網(wǎng)頁的性能問題隘冲,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是绑雄,在退出函數(shù)之前展辞,將不使用的局部變量全部刪除。
(2)閉包會在父函數(shù)外部万牺,改變父函數(shù)內(nèi)部變量的值罗珍。所以,如果你把父函數(shù)當作對象(object)使用脚粟,把閉包當作它的公用方法(Public Method)覆旱,把內(nèi)部變量當作它的私有屬性(private value),這時一定要小心核无,不要隨便改變父函數(shù)內(nèi)部變量的值扣唱。