Javascript--閉包(closure)

第一篇文章

 

在網上搜了好久這方面的知識,才找到一些資料,通過閱讀發現,閉包確實很重要。

定義:所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。

先給出一個簡單的例子:

函數a(): 裏面定義了一個b函數,而函數a()的返回值是b函數。

 

調用關係:定義一個c變量直接調用a函數,而a函數返回的是b函數,所以此時相當於:var c = a.b();

然後再調用c(), 就相當於調用a.b(); 此時會alert什麼呢? 答案是1。

 

解析:在javascript裏面如果一個變量沒有別調用的時候會被垃圾回收器回收掉,而這裏函數a()裏面的i是一個局部變量,所以在執行完var c = a();之後應該會被回收掉,但是這裏卻沒有,這就是因爲在a()函數裏面的b()函數又調用了這個i,這裏就產生了閉包的效果。

 

再看一個例子

這個例子會alert出什麼呢?答案是3個4。

解析:在定義了局部變量i之後,在這個for循環裏面也存在一個匿名函數,去訪問外部的局部變量,所以此時,這個i就不會被垃圾回收器回收,而循環完成之後,i的值一直都是4,所以在點擊元素的是後就會都是4。

 

個人理解:就是在函數的函數裏面調用外層函數定義的局部變量,而此時局部變量不會被回收,而是一直都存在。

 

待續:有待理解更加深入的問題,javascript垃圾回收機制。

發佈了26 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章