closure!

總結一下閉包。javascript

閉包的定義:當一個內部函數被其外部函數以外的變量所引用時,就造成了一個閉包。java

一個最簡單的閉包:閉包

function A(){
    var count=0;
    return function(){
        count++;
        console.log(count);
    };
}
var B=A();
B();    //1 
B();    //2
B();    //3

important!=>javascript的GC機制:函數

  在javascript中,若是一個對象再也不被引用,那麼這個對象就會被GC回收,不然這個對象一直會保存在內存中。spa

因此咱們就能夠理解爲何在上述代碼中,A函數明明已經被返回退出執行了,變量count卻沒有被回收(count一直在原來的基礎上增長1,而不是每一次都從新從0開始再增長1),由於匿名函數(閉包)被返回賦予變量B,即被變量B所引用(在javascript中對象的賦值是引用傳遞),故這個匿名函數不會GC回收,同時變量count被匿名函數所引用,因此變量count亦不會被回收,所以變量count纔會一直會保存於內存中。code

閉包的特性對象

js分全局做用域和函數做用域(沒有塊級做用域,if語句或for循環語句裏面定義的變量在外部能夠被訪問)。函數做用域裏能夠訪問到全局,經過一個叫做用域鏈(函數內部做用域=>父級函數的做用域=>父級函數的父級函數的做用域...=>全局做用域)的東西。
但全局怎麼訪問函數呢?咱們能夠經過在函數裏面返回一個函數(閉包),就能夠在全局訪問到函數裏的數據了(在上面代碼中,咱們在全局裏訪問到了A函數的count變量)。
不過閉包能訪問到父級函數裏面的數聽說明父級函數裏的數據一直存在內存中(一直被閉包所引用着),而沒有被GC所回收,這就會致使內存一直被佔着。
相關文章
相關標籤/搜索