閉包是JavaScript必須瞭解的一個知識點。
什麼是閉包?
閉包就是值有權訪問另一個函數作用域中的變量的函數,常見的方式就是:在一個函數內部創建另一個函數,並把這個函數作為返回值。
代碼部分:
<code>function
adolescent
(ages
) {var
age=24
;return
function
(additional
) {return
age+ages+additional; } }var
adult = adolescent(1
);var
result = adult(2
);/<code>
首先創建了一個函數adolescent,然後返回了一個匿名函數,匿名函數中則使用了局部變量age和ages,由於js的作用域鏈的關係,所以是可以訪問父級函數的變量。
然後在匿名函數中使用了父級作用域的變量,在返回這個函數。
然後我們執行adolescent函數,獲取到返回的匿名函數,在這裡的作用域是全局作用域,然後卻用到了局部的變量,這就是閉包。
最後用了變量adult接受這個匿名函數,然後執行。
閉包在我們開發就會不知覺用到,也許你自己都還不知道。
注意點:
過度使用閉包會佔用更多內存。
一般情況下,在函數執行完畢後,其中的局部變量都會自動銷燬,內存中僅保存著全局作用域的變量對象。
但是在另一個函數內部定義的函數(也就是閉包)會包含父級函數的作用域的變量對象。
就拿上面的代碼說:返回的是一個匿名函數,這個函數就包含了adolescent函數的作用域對象,所以當adolescent執行完後,他的作用域上的變量仍然存在內存中。
由於上述使用了adult變量來接受這個函數,而這個變量在全局變量中,所以內存不會釋放,所以我們只有手動釋放內存,即在最後把adult的引用設置為null就可以釋放內存。
<code>adult
=null/<code>
閉包是依靠了js的作用域鏈的特性而來的。
閉包的應用的地方還是非常多的,需要大家靈活應用,最重要的是要考慮到釋放內存