1. 程式人生 > >JavaScript 閉包(Closure)

JavaScript 閉包(Closure)

names console 結束 cti name 證明 輸出 tex 被垃圾回收

閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。

要學習閉包最先需要學習js的變量作用域(第一節教程已經講過),變量的作用域無非就是兩種:全局變量和局部變量。

js 語言的特殊之處,就在於函數內部可以直接讀取全局變量。另一方面,在函數外部自然無法讀取函數內的局部變量。

<script type="text/javascript">

function test1(){

  var name = "xiaoming";

  function getNames(){
  return name;//獲取內部變量
}
  return getNames();
}
  var otherName= test1();
  console.log(otherName);

</script>

閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。請看下面的代碼:

<script type="text/javascript">

  function test(){
    var num=2;
    function getNum(){
    num++;
    return num;
  }
  return getNum;
  }
  var names=test();
  var nums=names();
  console.log(nums);
  nums=names();
  console.log(nums);

</script>

輸出2,3

在這段代碼中,fun實際上就是閉包funIn函數。它一共運行了兩次,第一次的值是2,第二次的值是3。這證明了,函數test中的局部變量num一直保存在內存中,並沒有在test調用後被自動清除。

為什麽會這樣呢?原因就在於test是funIn的父函數,而funIn被賦給了一個全局變量(var fun),這導致funIN始終在內存中,而funIn的存在依賴於test,因此test也始終在內存中,不會在調用結束後被垃圾回收機制回收。

JavaScript 閉包(Closure)