DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> JavaScript基礎知識 >> JavaScript閉包的概念及用法
JavaScript閉包的概念及用法
編輯:JavaScript基礎知識     

1.閉包的概念:
 閉包就是能夠讀取其他函數內部變量的函數.
 例如: function f1(){
    var n=999;
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
 其中f2函數就是閉包。
 由於在Javascript語言中,只有函數內部的子函數才能讀取局部變量,
 因此可以把閉包簡單理解成"定義在一個函數內部的函數"。
 所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
2.閉包的用途:
 閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,
 另一個就是讓這些變量的值始終保持在內存中。
 怎麼來理解這句話呢?請看下面的代碼。
  function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000
 在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,
 第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,並沒有在f1調用後被自動清除。
 為什麼會這樣呢?原因就在於f1是f2的父函數,而f2被賦給了一個全局變量,這導致f2始終在內存中,
 而f2的存在依賴於f1,因此f1也始終在內存中,不會在調用結束後,被垃圾回收機制(garbage collection)回收。
 這段代碼中另一個值得注意的地方,就是"nAdd=function(){n+=1}"這一行,
 首先在nAdd前面沒有使用var關鍵字,因此nAdd是一個全局變量,而不是局部變量。
 其次,nAdd的值是一個匿名函數(anonymous function),而這個匿名函數本身也是一個閉包,
 所以nAdd相當於是一個setter,可以在函數外部對函數內部的局部變量進行操作。
 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved