什麼是閉包????
閉包(Closure)與函數有着緊密的關係,以致於許多人將函數與閉包等同起來討論,但結果卻老是討論不清楚。閉包
事實上在JavaScript 中,一個函數只是一段靜態的代碼、腳本文本,所以它是一個代碼書寫時,以及編譯期的、靜態的概念;
而閉包則是函數的代碼在運行過程當中的一個動態環境,是一個運行期的、動態的概念。函數
因爲引擎對每一個函數創建其獨立的上下文環境,所以當函數被再次執行或進入函數體內的代碼時,就將會獲得閉包內的所有信息。ip
閉包具備兩個特色:
第一:是閉包做爲與函數成對的數據,在函數執行過程當中處於激活(便可訪問) 狀態;
第二:是閉包在函數運行結束後,保持運行過程的最終數據狀態。作用域
所以函數的閉包總的來講決定了兩件事:閉包所對應的函數代碼如何訪問數據,以及閉包內的數據什麼時候銷燬。對於前者來講,涉及做用域(可見性)的問題;對於後者來講,涉及數據引用的識別。編譯