一往扔,閉包是什么贩猎?
閉包:有權訪問另一個函數(shù)中作用域的變量的函數(shù)。即間接訪問變量(隱藏一個變量)萍膛。創(chuàng)建閉包的常見方式就是在函數(shù)的內部創(chuàng)建一個函數(shù)吭服。
如上圖就是一個簡單的閉包,內部的函數(shù)可以訪問全局的變量蝗罗。
二艇棕,為什么會有閉包的概念
因為JavaScript語言的特殊性,JavaScript并沒有類的概念串塑,如何讓一個數(shù)據(jù)封裝成private變量就成了一個大問題沼琉。用var定義的是全局變量,內部的函數(shù)都會訪問到同一地址桩匪。舉個例子:
上面的代碼打印的是4個5打瘪。如何解決這個問題,我們就采用了閉包的概念來完美的解決吸祟。
我們在for的作用域下新建一個匿名函數(shù)(立即執(zhí)行)瑟慈,此時就構成了一個閉包,每一個變量被很好的獨立出來屋匕,里面的函數(shù)都可以用到獨立的i葛碧,此時的打印結果是每隔1s打印一個數(shù)字。(當然es6的標準我們可以用let解決var的作用域問題)过吻。
java中解決上面的方法可以是這樣:(但是JavaScript并沒有類的概念)
其實java中也有閉包的概念进泼,他是將方法封裝成一個變量去儲存蔗衡,這個方法能夠訪問類中所有的自由變量。
實際上乳绕,java的語言并沒有閉包绞惦,但他虛擬模擬閉包(即內部類+接口),用匿名內部類和接口去封裝閉包洋措。
所以從上面可以很簡單的知道济蝉,JavaScript的閉包可以實現(xiàn)間接的訪問一個變量,即隱藏一個變量菠发。
三王滤,一個閉包的例子
下面我寫一個排序算法,讓大家對閉包的概念有更深刻的認識:
上面也是一個閉包滓鸠,里面的匿名函數(shù)中雁乡,proName是上一個函數(shù)的變量,他被里面的函數(shù)所調用糜俗。實現(xiàn)了對象的排序算法踱稍。(可以想一下java是怎么實現(xiàn)這個方法的)。
綜上就是閉包的理解哦悠抹。
備注:ES6引入類的概念珠月。感謝段師兄和蔡師兄幫忙指出錯誤