1. 程式人生 > >js難點(一)閉包

js難點(一)閉包

要了解一個知識點,必須要弄懂它的概念,作用,以及應用場景。

首先,我們從閉包的概念出發;

閉包,就是指能訪問其他函式內部變數的一個函式。換個角度理解,要訪問某個函式內部定義的變數,全域性是無法訪問的,這時只需要在該函式內部定義一個子函式便可以訪問父函式定義的變數,而這個子函式,便可以稱為閉包。

接著從作用講起,閉包最大的作用,便是能夠防止變數被回收,亦即能儲存區域性變數。下面舉個例子:

function outerFun()
{
 var a=0;
 function innerFun()
 {
  a++;
  alert(a);
 }
 return innerFun;  //注意這裡
}
var obj=outerFun();
obj();  //結果為1
obj();  //結果為2
var obj2=outerFun();
obj2();  //結果為1
obj2();  //結果為2

注:innerFun便是閉包函式,它能訪問outerFun父函式的區域性變數a,也儲存了這一變數不被回收。

最終,應用場景便是我們需要掌握的,例如:

var db = (function() {
// 建立一個隱藏的object, 這個object持有一些資料
// 從外部是不能訪問這個object的
var data = {};
// 建立一個函式, 這個函式提供一些訪問data的資料的方法
return function(key, val) {
    if (val === undefined) { return data[key] } // get
    else { return data[key] = val } // set
    }
// 我們可以呼叫這個匿名方法
// 返回這個內部函式,它是一個閉包
})();

db('x'); // 返回 undefined
db('x', 1); // 設定data['x']為1
db('x'); // 返回 1