閉包的基本概念

上一篇:作?域鏈
下一篇:getter 與 setter

主要內容:

  • 閉包的基本概念
  • 閉包的基本形式
  • 閉包與內存

?般?認為閉包是?個神秘??晦澀的內容. 實際上并?如此. 接下來詳細說
明閉包的概念和閉包的?般的形式, 同時討論閉包的有點和缺點.

閉包的基本概念

所謂的閉包, 簡單說就是允許低級?鏈訪問?級?鏈的數據的結構.

在 "作?域鏈" ?節中介紹過, ?級?鏈可以直接訪問低級?鏈的數據, 但是反過來?法訪問:

var num1 = 123;
function foo() {
  var num2 = 456;
  console.log("1 級?鏈允許訪問 0 級?鏈 " + num1);
}
foo();
try {
  console.log(num2);
} catch (e) {
  console.log("0 級?鏈?法訪問 1 級?鏈的數據");
}

但是如果允許訪問這個數據, 那就構成閉包結構.

閉包的通俗含義

閉包, 從字?意義上來解釋, 就是包裹起來的, 封閉起來的結構. 在 JavaScript 中, 函數就是?個封閉的結構. 在函數中定義的數據, 在外?是訪問不到的.

(function () {
  var num = 123,
      obj = {},
      arr = [],
      isTrue = false,
      str = "abc",
      foo = function() {};
})();

在函數外?是絕對?法訪問??定義的數據的. 因此它就構成?個封閉的結構. 但是沒有任何作?, 因此在 JavaScript 中需要將其對外開放?些接?, 以便使?這些數據. 這就是要求函數返回?個數據, 好么函數要么對象.

閉包的基本結構

要在函數外訪問函數內的數據, 最簡單的就是返回?個函數:

function foo() {
  var num = 123;
  return function() {
    return num;
  }
}

當函數返回?個函數的時候, 返回的函數允許返回?個數據. 那么在函數外就可以訪問函數內的數據了. 但是僅僅是訪問這個數據, 有時需要對其進?修改.因此既要求獲得數據, 也要求可以修改數據. 因此就需要兩個函數, 那可以返回?個對象:

function foo() {
  var num = 123;
  return {
    get_Num: function() {
      return num;
    },
    set_Num: function(value) {
      num = value;
    }
  }
}
var o = foo();
console.log(o.get_Num()); // => 123
o.set_Num(456);
console.log(o.get_Num()); // => 456
?結?下閉包的這個結構:
  • ?先有?個函數, 在函數中定義數據
  • 同時返回?個函數, 允許訪問函數內部的數據
  • 調?函數, 返回允許訪問內部數據的函數
  • 利?返回的函數, 允許在外界訪問函數內定義的數據

閉包的基本案例

有了閉包, 可以做到事情就變得?常多了. 下?通過?個案例來說明閉包的使?

使?閉包模擬私有變量
// v3 使??法, v5 可以直接使? getter
var person = function(name, age, gender) {
  return {
    get name() {
      return name;
    },
    get age() {
      return age;
    },
    get gender() {
      return gender;
    }
  }
};
var obj = person("jk", 19, "male");
console.log(obj.name);
console.log(obj.age);
console.log(obj.gender);
使?閉包模擬塊級作?域
var sum = 0;
(function () {
  for (var i = 0; i <= 100; i++) {
    sum += i;
  }
})();
console.log(sum);
使?閉包創建唯?標識符
var uniqueInteger = (function () {
  var count = 0;
  return function() {
    return count++;
  };
})();

閉包與內存

使?閉包可以?常?便的組織代碼, 將不需要對外公開的代碼都封裝起來, 保護起來. 使得代碼更加緊湊, 維護更加?便. 但是使?閉包, 保存了私有數據,容易造成內存的泄露.

為了更加?便的解釋這個問題, ?先討論?下 JavaScript 中內存的管理.

內存管理

JavaScript 具有垃圾收集的功能. 也就是說當執?環境會負責管理代碼的執?過程使?的內存, 包括內存的分配與釋放. 在傳統的程序設計中, 例如 C, C++,需要?動的管理內存, 申請, 釋放都需要?動的處理. 因此容易出現問題. 在JavaScript 中不需要這么?煩, 所有的事情都由 JavaScript 引擎去完成.

常?的內存管理?式有兩種: 標記式, 引?計數式.

使?標記式內存管理, 運?時在內存中會標記所有的不再使?的數據, 進?加以回收. 如今?部分瀏覽器所采?的是標記式內存管理. 只是進?內存回收的時間不同?已.

使?引?計數式內存管理, 運?時會給每?個對象加上編號, 凡是有變量指向該對象, 引?計數就 +1 , 凡是減少?個引?, 計數就 -1. 那么當引?計數為 0的時候, 回收內存. 但是?旦出現循環引?, 就容易造成內存泄露.

JavaScript 中不需要??考慮內存維護的問題, 所有的內存維護都可以由JavaScript 引擎去處理. 但是為了更好的提升性能, 建議在不使?數據的時候,將其設置為 null

上一篇:作?域鏈
下一篇:getter 與 setter

?結

  • 閉包的基本概念
  • 閉包的實現?式
  • 閉包案例
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容