JavaScript之坑了我--閉包原理不過如此

eBusinessMan發表於2015-11-10

上班過程中有沒有遇到這種程式設計需求

function show(){
  var count = 10;
}

show();//執行

上面的程式碼中,如果我要操縱區域性變數count的話,我們應該怎麼辦??我們沒辦法,因為當show()執行完畢後,區域性變數count就會被回收,我們根本無法獲取之。

閉包的產生,就是為我們提供了操縱函式區域性變數的方式!是不是很神奇?這在java中是我沒有看見過的。

分析:

我們知道,計算機中的記憶體變數如果有被引用著的話,則系統是不會將之回收的。只要我們能夠一直持有這個引用,則就可以令區域性變數避免被回收——這是閉包概念成立的前提。

我們改造show函式:

function show(){

  var count = 10;

  function getCount(){ //宣告一個區域性函式物件,相當於:

// var getCount  =  new  Function(“console.log(count++);”);

console.log(count++);

}

return getCount; //將函式物件首地址返回。

}

       var showCount  = show(); // 賦值給showCout

//我們多次呼叫 showCount()……

       showCount(); //列印10

       showCount(); //列印11

       showCount(); //列印12

       showCount(); //列印13

// 由上,從10 ….. 13, 我們可以知道count在show()執行完畢後沒有被回收,否則也// 不會每次都遞增1.

// 於是我們就將區域性變數保留了下來。。。。。。

分析:由於showCount引用了getCount,則getCount不會被回收,因此,getCount內的引用的變數(當然這個變數不是getCount中執行才宣告的區域性變數)也不會被回收。

 

不過,這裡,注意一點(盲區):

function show(){

  var count = 10;

  return count ;

}

var x = show();//僅僅是將count的值賦給x,而count已被回收。傳值!!

請勿與上面的混淆了!!!!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29900383/viewspace-1827382/,如需轉載,請註明出處,否則將追究法律責任。

相關文章