一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

正確理解Javascript閉包

時(shí)間:2024-06-15 21:46:16 JavaScript 我要投稿
  • 相關(guān)推薦

正確理解Javascript閉包

  正確理解Javascript閉包

  閉包是ECMAScript一個(gè)很重要的特征,但是卻很難用合適的定義來(lái)描述它。雖然閉包很難清晰地描述,但是,卻很容易創(chuàng )建,或者說(shuō),不小心創(chuàng )建。然而,閉包的存在其實(shí)是有一定的潛在問(wèn)題的。為了避免“不小心”地創(chuàng )建閉包,以及更好地利用閉包的優(yōu)點(diǎn),有必要理解閉包的機制。

  閉包的定義

  關(guān)于閉包,有太多的定義,特別是有一些定義非常抽象,象這個(gè):

  A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables.

  大致是說(shuō)閉包是一個(gè)表達式,擁有一些自由變量及綁定這些變量的執行環(huán)境。這種定義太書(shū)面化,反而難以理解。

  還有另一個(gè)定義:

  所有函數都是閉包。這個(gè)定義給我很大的迷惑,換句話(huà)說(shuō),由于Javascript沒(méi)有塊級作用域,因此閉包一般指的是函數(想不出除了函數以外還有哪些方式可以構成閉包)。

  這里不想太多討論函數與閉包的關(guān)系,下面給出我認為比較容易理解的定義吧。

  首先,閉包的存在是基于作用域鏈。由于作用域鏈的機制,所有函數(即使全局函數)都能引用上下文執行環(huán)境中的變量(即free variables)。

  其次,閉包內部必須有free variables。順便說(shuō)下兩種變量1. Local variables (bound variables) 2. Non-local variables (free variables)

  最后,在其上下文環(huán)境結束后仍然存在。即內部函數擁有比它的外部函數更長(cháng)的生命周期。

  關(guān)于閉包定義的解析

  關(guān)于閉包定義的兩點(diǎn),一直在考慮是不是必須同時(shí)滿(mǎn)足。

  首先,如果閉包內部沒(méi)有free variables,即是說(shuō)它沒(méi)有訪(fǎng)問(wèn)外部的變量,那么就失去了閉包的意義。(除非通過(guò)其他閉包改變了行為)因此,我認為free variables是必要條件。

  其次,如果函數內部存在free variables,但是當其上下文環(huán)境銷(xiāo)毀后,它也跟著(zhù)銷(xiāo)毀?梢韵胂髢炔亢瘮,雖然訪(fǎng)問(wèn)了其外部函數變量,但是當外部函數執行完后也隨之回收。這種情況下,閉包的討論也沒(méi)有意義。

  來(lái)看兩個(gè)例子:

  復制代碼 代碼如下:

  var objectA = (function() {

  var localA = "localA";

  innerFn();

  // 單純的內部函數調用

  function innerFn() {

  localA = "innerChange";

  }

  return {

  getLocalA : function() {

  return "empty";

  }

  };

  })();

  objectA.getLocalA();

  objectA.getLocalA = function() {

  return localA;

  };

  //console.log(objectA.getLocalA()); //error: localA is not defined

  var objectB = (function() {

  var localB = "localB";

  return {

  getLocalB : function() {

  return "empty";

  },

  updateGetLocalB : function() {

  this.getLocalB = function() {

  return localB;

  };

  },

  updateLocalB : function() {

  localB = "changeLocalB";

  }

  };

  })();

  console.log(objectB.getLocalB()); // empty

  // 通過(guò)其他閉包改變

  objectB.updateGetLocalB();

  console.log(objectB.getLocalB()); // localB

  objectB.updateLocalB();

  console.log(objectB.getLocalB()); // changeLocalB

  閉包的優(yōu)點(diǎn)和缺點(diǎn)

  閉包的優(yōu)點(diǎn)是閉包內部可以訪(fǎng)問(wèn)到定義它們的外部函數的參數和變量(除了this和arguments)。

  閉包主要的問(wèn)題便是它會(huì )保存包含它的函數的作用域,因此比一般函數占用更多的內存空間,因此不宜過(guò)度使用閉包。

  閉包的應用

  閉包最基本的應用場(chǎng)景便是通過(guò)保護內部變量從而實(shí)現私有,比如模塊模式。

  

【正確理解Javascript閉包】相關(guān)文章:

javascript的閉包概念怎么理解06-15

javascript閉包的定義及應用實(shí)例分析08-25

Javascript 閉包引起IE內存泄露分析07-05

對javascript的理解08-08

常用的JavaScript模式09-22

Javascript的this用法簡(jiǎn)述08-15

JavaScript學(xué)習筆記08-24

JavaScript 基礎教學(xué)09-29

JavaScript的課堂講解09-03

JavaScript常用方法匯總10-25

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看