閉包是一種特殊的物件,其中結合了兩樣東西︰函數,和函數所建立的環境。環境由任意的局域變數所組成,這些變數是由在閉包建立的時間點上存在於作用域裡的所有變數。
白話文:
只要直接在函數裏引用外層的變數,然後當我們將「函數封閉起來傳回」時,該函數仍然可以正常使用,這就是閉包的概念了。
其實許多的 event handler 都已經採用了 closure 的概念了,它不但是一個 callback 的機制,而且還能存取到定義處所見的變數,因此是一個有效的模組化技巧。
當然你可以說 C 不就已經有函數指標,可以拿來當成 callback 的機制了嗎? 是的,但是 javascript 的語法,可以在函數內部定義另一個函數,不管這個語法是有意造成或無意的,它促成了模組化之外更進一步的 namespace 的控制--除了得到 callback 的函數,沒有人看得到這個 callback 。
當然你可以說 C 不就已經有函數指標,可以拿來當成 callback 的機制了嗎? 是的,但是 javascript 的語法,可以在函數內部定義另一個函數,不管這個語法是有意造成或無意的,它促成了模組化之外更進一步的 namespace 的控制--除了得到 callback 的函數,沒有人看得到這個 callback 。
參考資料:
沒有留言:
張貼留言