精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

揭開Javascript閉包的真實面目

開發 前端
閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分,本文將用通俗的語言帶您深入理解Javascript閉包的概念。

對于初學者來說,理解Javascript閉包(closure)還是比較困難的,而撰寫此文的目的就是用最通俗的文字揭開Javascript閉包的真實面目,讓初學者理解起來更加容易一些。

一、什么是閉包?

“官方”的解釋是:閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。相信很少有人能直接看懂這句話,因為他描述的太學術。

其實這句話通俗的來說就是:JavaScript中所有的function都是一個閉包。不過一般來說,嵌套的function所產生的閉包更為強大,也是大部分時候我們所謂的“閉包”。看下面這段代碼:

  1. function a() {   
  2.  var i = 0;   
  3.  function b() {   
  4.   alert(++i);   
  5.  }   
  6.  return b;   
  7. }   
  8. var c = a();   
  9. c();  

這段代碼有兩個特點:

1. 函數b嵌套在函數a內部。

2. 函數a返回函數b。

這樣在執行完var c=a()后,變量c實際上是指向了函數b,b中用到了變量i,再執行c()后就會彈出一個窗口顯示i的值(***次為1)。這段代碼其實就創建了一個閉包,為什么?因為函數a外的變量c引用了函數a內的函數b,就是說:

當函數a的內部函數b被函數a外的一個變量引用的時候,就創建了一個我們通常所謂的“閉包”。讓我們說的更透徹一些。所謂“閉包”,就是在構造函數體內定義另外的函數作為目標對象的方法函數,而這個對象的方法函數反過來引用外層外層函數體中的臨時變量。

這使得只要目標對象在生存期內始終能保持其方法,就能間接保持原構造函數體當時用到的臨時變量值。盡管最開始的構造函數調用已經結束,臨時變量的名稱也都消失了,但在目標對象的方法內卻始終能引用到該變量的值,而且該值只能通這種方法來訪問。

即使再次調用相同的構造函數,但只會生成新對象和方法,新的臨時變量只是對應新的值,和上次那次調用的是各自獨立的。為了更深刻的理解閉包,下面讓我們繼續探索閉包的作用和效果。

二、閉包有什么作用和效果?

簡而言之,閉包的作用就是在a執行完并返回后,閉包使得Javascript的垃圾回收機制GC不會收回a所占用的資源,因為a的內部函數b的執行需要依賴a中的變量。這是對閉包作用的非常直白的描述,不專業也不嚴謹,但大概意思就是這樣,理解閉包需要循序漸進的過程。

在上面的例子中,由于閉包的存在使得函數a返回后,a中的i始終存在,這樣每次執行c(),i都是自加1后alert出i的值。那么我們來想象另一種情況,如果a返回的不是函數b,情況就完全不同了。

因為a執行完后,b沒有被返回給a的外界,只是被a所引用,而此時a也只會被b引用,因此函數a和b互相引用但又不被外界打擾(被外界引用),函數a和b就會被GC回收。(關于Javascript的垃圾回收機制將在后面詳細介紹)

三、閉包的微觀世界

如果要更加深入的了解閉包以及函數a和嵌套函數b的關系,我們需要引入另外幾個概念:函數的執行環境(excution context)、活動對象(call object)、作用域(scope)、作用域鏈(scope chain)。以函數a從定義到執行的過程為例闡述這幾個概念。

1. 當定義函數a的時候,js解釋器會將函數a的作用域鏈(scope chain)設置為定義a時a所在的“環境”,如果a是一個全局函數,則scope chain中只有window對象。

2. 當執行函數a的時候,a會進入相應的執行環境(excution context)。

3. 在創建執行環境的過程中,首先會為a添加一個scope屬性,即a的作用域,其值就為第1步中的scope chain。即a.scope=a的作用域鏈。

4. 然后執行環境會創建一個活動對象(call object)。活動對象也是一個擁有屬性的對象,但它不具有原型而且不能通過JavaScript代碼直接訪問。創建完活動對象后,把活動對象添加到a的作用域鏈的最頂端。此時a的作用域鏈包含了兩個對象:a的活動對象和window對象。

5. 下一步是在活動對象上添加一個arguments屬性,它保存著調用函數a時所傳遞的參數。

6. ***把所有函數a的形參和內部的函數b的引用也添加到a的活動對象上。在這一步中,完成了函數b的的定義,因此如同第3步,函數b的作用域鏈被設置為b所被定義的環境,即a的作用域。

到此,整個函數a從定義到執行的步驟就完成了。此時a返回函數b的引用給c,又函數b的作用域鏈包含了對函數a的活動對象的引用,也就是說b可以訪問到a中定義的所有變量和函數。函數b被c引用,函數b又依賴函數a,因此函數a在返回后不會被GC回收。

當函數b執行的時候亦會像以上步驟一樣。因此,執行時b的作用域鏈包含了3個對象:b的活動對象、a的活動對象和window對象,當在函數b中訪問一個變量的時候,搜索順序是:

1. 先搜索自身的活動對象,如果存在則返回,如果不存在將繼續搜索函數a的活動對象,依次查找,直到找到為止。

2. 如果函數b存在prototype原型對象,則在查找完自身的活動對象后先查找自身的原型對象,再繼續查找。這就是Javascript中的變量查找機制。

3. 如果整個作用域鏈上都無法找到,則返回undefined。

小結,本段中提到了兩個重要的詞語:函數的定義與執行。文中提到函數的作用域是在定義函數時候就已經確定,而不是在執行的時候確定(參看步驟1和3)。用一段代碼來說明這個問題:

  1. function f(x) {   
  2.  var g = function () { return x; }   
  3.  return g;   
  4. }   
  5. var h = f(1);   
  6. alert(h());  

這段代碼中變量h指向了f中的那個匿名函數(由g返回)。

◆假設函數h的作用域是在執行alert(h())確定的,那么此時h的作用域鏈是:h的活動對象->alert的活動對象->window對象。

◆假設函數h的作用域實在定義時確定的,就是說h指向的那個匿名函數在定義的時候就已經確定了作用域。那么在執行的時候,h的作用域鏈為:h的活動對象->f的活動對象->window對象。

如果***種假設成立,那輸出值就是undefined;如果第二種假設成立,輸出值則為1。 運行結果證明了第2個假設是正確的,說明函數的作用域確實是在定義這個函數的時候就已經確定了。

四、閉包的應用場景

1. 保護函數內的變量安全。以最開始的例子為例,函數a中i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。

2. 在內存中維持一個變量。依然如前例,由于閉包,函數a中i的一直存在于內存中,因此每次執行c(),都會給i自加1。

3. 通過保護變量的安全實現JS私有屬性和私有方法(不能被外部訪問)推薦閱讀:http://javascript.crockford.com/private.html。私有屬性和方法在Constructor外是無法被訪問的:

  1. function Constructor(...) {   
  2.  var that = this;   
  3.  var membername = value;   
  4.  function membername(...) {...}   
  5. }  

以上3點是閉包最基本的應用場景,很多經典案例都源于此。

五、Javascript的垃圾回收機制

在Javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收。如果兩個對象互相引用,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收。因為函數a被b引用,b又被a外的c引用,這就是為什么函數a執行后不會被回收的原因。

六、結語

理解JavaScript的閉包是邁向高級JS程序員的必經之路,理解了其解釋和運行機制才能寫出更為安全和優雅的代碼。

【編輯推薦】

  1. 淺析Javascript閉包的特性
  2. 三大秘訣助你輕松搞定JavaScript
  3. 深入解讀JavaScript中BOM和DOM
  4. 關于使用JavaScript的幾點建議
  5. 早該知道的7個JavaScript技巧
責任編輯:王曉東 來源: felixwoo
相關推薦

2020-08-11 08:13:46

微服務

2020-08-12 07:48:11

鏈表單向鏈結點

2017-09-01 10:32:56

2009-07-28 09:02:22

2010-09-09 15:05:27

2016-12-23 14:29:41

大數據大數據思維大數據產業

2021-02-21 16:21:19

JavaScript閉包前端

2016-09-14 09:20:05

JavaScript閉包Web

2009-07-24 17:30:37

Javascript閉

2010-07-07 09:28:25

云計算虛擬化

2025-07-28 02:44:00

閉包函數詞法

2011-05-25 14:48:33

Javascript閉包

2020-10-14 15:15:28

JavaScript(

2016-12-26 13:20:33

大數據真實面目動向

2012-11-29 10:09:23

Javascript閉包

2016-09-18 20:53:16

JavaScript閉包前端

2017-09-14 13:55:57

JavaScript

2016-12-23 21:29:25

大數據解析動向

2011-03-02 12:33:00

JavaScript

2011-05-12 18:26:08

Javascript作用域
點贊
收藏

51CTO技術棧公眾號

中文字幕一区二区三三| 亚乱亚乱亚洲乱妇| 性感少妇一区| 精品国产自在精品国产浪潮| 被黑人猛躁10次高潮视频| 国产精品原创| 国产精品久久久久天堂| 国产一区免费视频| 夜夜狠狠擅视频| 国产亚洲欧美久久久久| 国产中文字幕在线| 国产伦精品一区二区三区免费迷| 成人综合在线观看| 18久久久久久| 夫妻性生活毛片| 小嫩嫩12欧美| 91精品国产一区二区三区| 日韩av三级在线| 影音先锋男人资源在线| 久久久综合精品| 91九色综合久久| 亚洲 欧美 中文字幕| 欧美淫片网站| 日韩在线观看免费高清| 一二三不卡视频| 成人爽a毛片免费啪啪红桃视频| 91传媒视频在线播放| 国产一线二线三线女| 麻豆免费在线观看| 亚洲国产高清不卡| 欧美一区二区三区四区夜夜大片| 亚洲精品久久久久avwww潮水| 免费不卡在线观看| 国产精品高潮呻吟久久av无限| 日本免费观看视| 亚洲国产二区| 欧美黑人国产人伦爽爽爽| 国产福利在线导航| 狠狠操综合网| 亚洲色图综合久久| 国产男男chinese网站| 农村少妇一区二区三区四区五区 | 中文字幕亚洲一区二区三区五十路| www.555国产精品免费| 视频一区日韩精品| 日韩欧美一级特黄在线播放| www.成年人| 亚洲精品成a人ⅴ香蕉片| 欧美特级限制片免费在线观看| 日韩免费高清在线| japanese23hdxxxx日韩| 在线亚洲免费视频| 天天爽人人爽夜夜爽| 日韩欧美2区| 欧美无人高清视频在线观看| 在线观看的毛片| 日本午夜免费一区二区| 717成人午夜免费福利电影| 999这里有精品| 久久久久久免费看| 男同在线观看| 久久亚洲二区三区| 欧美重口乱码一区二区| 国产高清av在线| 欧美极品另类videosde| 五码日韩精品一区二区三区视频| 国产精品99999| 国产精品久久久久久亚洲伦| 在线视频不卡一区二区| 色噜噜狠狠狠综合欧洲色8| 亚洲一区在线观看免费| 91视频 -- 69xx| 日韩不卡视频在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 午夜在线视频| 一区二区三区四区国产精品| 天堂…中文在线最新版在线| 电影久久久久久| 欧美一区二区精品在线| 最新版天堂资源在线| 亚洲永久精品唐人导航网址| 中文字幕国产亚洲| 精品人妻在线播放| 日韩不卡一区二区| 91精品黄色| 暖暖视频在线免费观看| 日韩毛片高清在线播放| 国产3p露脸普通话对白| 成人亚洲网站| 亚洲国产毛片完整版| www.黄色在线| 国产精品豆花视频| 国产精品久久999| 精品黑人一区二区三区在线观看 | 国产伦精品一区二区三区免 | 欧美国产视频在线| 黄色一级视频播放| 女厕盗摄一区二区三区| 欧美精品日韩精品| 亚洲一区二区观看| 欧美激情视频一区二区三区在线播放| 国产91精品高潮白浆喷水| 又骚又黄的视频| 成人精品视频网站| 一区二区在线中文字幕电影视频| 678在线观看视频| 精品视频在线免费观看| 六十路息与子猛烈交尾| 久久综合伊人77777麻豆| 高清全集视频免费在线| 色婷婷av一区二区三区gif| 欧美日韩一区二区区| 俺要去色综合狠狠| 2019日本中文字幕| av免费观看网址| 国产精品色哟哟网站| 国产h视频在线播放| 久久综合偷偷噜噜噜色| 中文字幕一区电影| 久久久久久不卡| 高潮精品一区videoshd| 资源网第一页久久久| 成人软件在线观看| 精品一区二区三区电影| 久久9999久久免费精品国产| 国产乱子伦视频一区二区三区 | 国产伦精品一区二区三区| av在线免费网址| 欧美日韩国产小视频在线观看| 青青草福利视频| 国产欧美精品| 国产亚洲欧美一区二区三区| 免费在线国产视频| 欧美一级久久久久久久大片| 精品一区二区在线观看视频| 日本亚洲最大的色成网站www| 欧美精品一区二区三区在线四季| 国产亚av手机在线观看| 日韩午夜av电影| 久久精品一级片| 国产999精品久久久久久 | 免费在线观看成人av| 激情伦成人综合小说| av影片在线| 亚洲国产美女久久久久 | 欧美日韩在线不卡| 国精产品视频一二二区| 蜜臀av一区二区在线观看 | 69av在线| 欧美日韩高清在线播放| jizzjizz日本少妇| 激情成人综合网| 久久久久久久久影视| 视频精品二区| 欧美激情日韩图片| 天天综合网天天综合| 精品久久中文字幕久久av| 国产肉体xxxx裸体784大胆| 国产精品腿扒开做爽爽爽挤奶网站| 精品视频导航| 欧美福利在线播放| 自拍偷拍亚洲精品| 国产精品美女一区| 亚洲国产婷婷综合在线精品| 特级西西人体wwwww| 日韩精品一二三区| 在线一区日本视频| 成人台湾亚洲精品一区二区| 7777精品视频| wwwxxx在线观看| 制服丝袜亚洲播放| 日韩免费一级片| 日本一区二区三区高清不卡| 性生活免费在线观看| 欧美成人一区二免费视频软件| 国产精品一区二区三区不卡| 原纱央莉成人av片| 日韩在线视频免费观看| 亚洲国产剧情在线观看| 色婷婷精品久久二区二区蜜臀av| 国产91在线播放九色| 成人sese在线| 久久久精品麻豆| 国产精品啊v在线| 日韩在线三区| 波多野结衣在线一区二区| 日韩av免费看| aaa大片在线观看| 亚洲乱码av中文一区二区| 国产精品一区二区三区在线免费观看 | 日韩欧美三级电影| 日韩精品视频在线看| 97超级碰碰碰| av网站在线免费| 国产亚洲视频中文字幕视频| www.超碰在线.com| 在线观看成人小视频| 国产一级二级毛片| 国产精品白丝在线| 黄色a一级视频| 国产东北露脸精品视频| 午夜视频在线瓜伦| 99国产精品视频免费观看一公开| 亚洲国产精品久久久久久女王| 国产精品白丝一区二区三区| 国产精品一区久久久| 亚洲妇女成熟| 久久免费视频在线观看| 国产一二三区在线观看| 亚洲午夜精品视频| 日本激情一区二区| 日韩小视频在线观看专区| 精品乱码一区内射人妻无码 | 久久99久久99精品中文字幕 | 亚洲国产成人一区二区三区| 182在线视频| 国产成人高清在线| 91网址在线观看精品| 日韩精品亚洲一区| 韩国一区二区av| 亚洲激情不卡| 男人添女荫道口喷水视频| 亚洲字幕久久| 免费看啪啪网站| 日韩久久综合| 日韩欧美三级电影| 精品黄色一级片| 欧美日韩一区二区三区在线视频 | 精品久久在线| 国产精品久久久久一区二区| 最新欧美色图| 欧美在线视频观看| 伊人网在线播放| 91po在线观看91精品国产性色 | 亚洲欧洲日韩| 免费国产成人看片在线| 91久久久精品国产| 国产一区一区三区| 中文字幕av亚洲精品一部二部| 伊人久久大香线蕉成人综合网| 青青草综合网| 亚洲一区二区四区| 91亚洲国产| 麻豆映画在线观看| 欧美日韩少妇| 国内精品视频一区二区三区| 亚洲成人资源| www黄色日本| 久久国产毛片| 91网址在线播放| 麻豆成人在线观看| 在线观看日本www| 国产成人亚洲综合色影视| 中文在线字幕观看| 成人高清免费观看| 大黑人交xxx极品hd| 久久免费美女视频| 超碰人人干人人| 日韩一区在线免费观看| 福利所第一导航| 亚洲亚洲精品在线观看| 在线观看国产亚洲| 欧美在线不卡视频| 国产又大又粗又长| 亚洲成人aaa| 国产午夜精品一区理论片| 精品国产欧美成人夜夜嗨| 欧美黄色视屏| 欧美中文在线免费| 免费一级欧美在线观看视频| 91久久精品国产91久久性色tv| 成人另类视频| 亚洲黄色成人久久久| 综合久久99| 国产网站免费在线观看| 免费成人在线观看视频| 亚洲av综合色区无码另类小说| www.在线欧美| 亚洲 欧美 国产 另类| 亚洲成人一区二区| 最近中文字幕免费观看| 日韩欧美精品在线视频| 国产尤物视频在线| 欧美巨乳在线观看| 成人爽a毛片免费啪啪| 91日韩在线视频| 日本福利一区| 国内外成人激情免费视频| 亚洲永久网站| 免费欧美一级片| 久久精品亚洲国产奇米99| 视频这里只有精品| 一本久久a久久精品亚洲| 国产av一区二区三区精品| 亚洲人成毛片在线播放| 日本小视频在线免费观看| 国产精品旅馆在线| 农村少妇一区二区三区四区五区| 一区二区三区四区免费视频| 国产精品女主播一区二区三区| 午夜剧场高清版免费观看| 91在线看国产| 美女福利视频在线观看| 在线观看一区二区精品视频| 亚洲欧美另类视频| 日韩中文在线中文网在线观看| 国产色播av在线| 亚洲自拍另类欧美丝袜| 成人精品影视| 女人另类性混交zo| 成人精品一区二区三区四区| www.xx日本| 欧美视频一区在线| 四虎精品成人免费网站| 欧美激情综合色| 欧美2区3区4区| 亚洲色图自拍| 欧美aⅴ一区二区三区视频| 女尊高h男高潮呻吟| 亚洲香蕉伊在人在线观| 国产精品系列视频| 精品国产一区二区三区四区在线观看| 性感美女一区二区在线观看| 精选一区二区三区四区五区| 亚洲国产第一| 催眠调教后宫乱淫校园| 亚洲综合色丁香婷婷六月图片| 国产精品久久久久久免费| 在线观看欧美成人| av在线一区不卡| 深田咏美在线x99av| 视频一区欧美精品| 日本少妇高潮喷水xxxxxxx| 欧美日韩亚洲激情| 亚洲色偷精品一区二区三区| 午夜精品视频在线| 欧美a一欧美| 国产 福利 在线| ww久久中文字幕| 4438国产精品一区二区| 亚洲欧美精品中文字幕在线| 最新中文字幕在线播放| 欧美一区二区视频在线| 日韩高清一区在线| 手机看片国产日韩| 在线成人高清不卡| 欧美精品videosex| 精品免费日产一区一区三区免费| 99视频+国产日韩欧美| 在线免费观看a级片| 色综合久久综合| 每日更新在线观看av| 国产精品电影在线观看| 欧美中文一区二区| 久久久久久综合网| 一区二区成人在线视频| 色一情一乱一乱一区91av| 4388成人网| 欧洲杯半决赛直播| 一级淫片在线观看| 亚洲一级二级在线| 日本在线视频1区| 国产精品丝袜高跟| 午夜日韩电影| 成年人网站免费看| 欧美久久一二区| 8x8ⅹ拨牐拨牐拨牐在线观看| 欧美日韩在线精品一区二区三区| 日本美女视频一区二区| 91插插插插插插| 亚洲精品国精品久久99热一| 亚洲精品粉嫩美女一区| 麻豆传媒网站在线观看| 99久久精品国产一区| 久久久久精彩视频| 欧美大片免费观看| 综合亚洲色图| 天堂av.com| 欧美日韩国产页| 在线免费黄色| 国产久一道中文一区| 日韩黄色在线观看| 久青草视频在线观看| 亚洲无av在线中文字幕| 91在线一区| 天天色综合社区| 天天影视色香欲综合网老头| 日本免费视频在线观看| 久久久久久久久久久久久久一区| 另类成人小视频在线| 日本在线视频中文字幕| 色偷偷噜噜噜亚洲男人| 老司机精品视频在线播放| 一区二区三区 日韩| 午夜电影网一区| 性欧美ⅴideo另类hd| 天天久久人人| 91蜜桃婷婷狠狠久久综合9色| 99热精品在线播放| 国产精品劲爆视频|