我的漫漫程序之旅

          專注于JavaWeb開發
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0

          導航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(39)

          隨筆檔案(43)

          文章分類(304)

          文章檔案(257)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          JavaScript閉包詳解

          1、何謂閉包

          JavaScript例子:

          function GISMapPanel() 
          this.mapPanel = document.getElementById("mapDiv"); 
          this.width; 
          this.height; 

          this.showMap = function() 
          alert(
          this.mapPanel); //tip:[object] 
          this.mapPanel.onmousedown = this.mouseDownEventProcess(); 
          }
           

          this.mouseDownEventProcess = function( )
          var _this = this
          return function() 
          alert(
          this.mapPanel); //tip:undefined,why; 
          _this.width = 400
          _this.height 
          = 300
          //other codes 
          }
           
          }
           
          }
           


          閉包簡單的解釋是,ECMAScript允許inner functions(嵌套函數):函數可以定義在另外一個函數里面。這些內部的函數可以訪問outer function(父函數)的local變量,參數,其它內部函數。當內部函數被構造,并可以在函數外被獲得(函數當成返回值),這個內部函數在 outer function返回后被執行(在outer函數外執行),那一個閉包形成了。

          閉包特征:A、作為一個函數變量的一個引用,當函數返回時,其處于激活狀態;B、一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。


          2、 閉包隱喻

          function就像房子內的居室(也是房子),可以租給給甲居住,甲就是居室(function)的主人(this),也可以租給乙住,乙就成為居室(function)的主人(this),甲原來的一切則被甲帶走,乙用不到任何甲的東西。如果甲是房子(外層function)的主人,并把某居室(內層function)租給乙,乙具有居室內的一切,而乙也可以使用甲的衛生間、客廳(外層函數變量,如_this)。閉包變量就是外層房子內變量,包括居室(function)、衛生間、客廳(外層函數變量)。同JavaScript閉包,居室可以是一局、兩局、多局,當然一局一般比較好租,JavaScript閉包一般也是一局。

          3、閉包作用

          面向對象編程的成功和流行,使不支持面向的對象編程的語言也盡量往這個方向靠,如C語言可以通過struct及function指針,模擬面向對象編程,以期達到面向對象的封裝、多態;JavaScript則通過基于對象編制以期達到封裝性。如上例所示,把地圖(div)相關的事件處理代碼、相關屬性、相關方法集中到GISMapPanel對象中。但由于事件發生的實體是地圖對應的div對象,事件函數調用時房子是由div對象居住的,也就是說this是div元素,因此,會出現alert(this.mapPanel); //tip:undefined,div元素沒有屬性mapPanel;如果想要訪問原GISMapPanel對象中的屬性,就要象例子所示,把GISMapPanel對象當作一個客廳來處理,從而可以使用客廳內的東西,而不是別人居室內的東西(也是訪問不到的,正如alert(this.mapPanel); //tip:undefined,該this就不是外層居室的this了,本來想直接訪問外層居室的this)。通過閉包、基于對象,取代了全局變量、函數方式的JavaScript處理事件、業務邏輯處理手段,增加了模塊性、封裝性、問題局部化等特性。

          posted on 2008-07-20 22:36 々上善若水々 閱讀(990) 評論(0)  編輯  收藏 所屬分類: JavaScript

          主站蜘蛛池模板: 通河县| 积石山| 金山区| 柘荣县| 陈巴尔虎旗| 罗定市| 黑山县| 景谷| 稷山县| 南充市| 手游| 永新县| 建阳市| 衡阳县| 高州市| 安多县| 临夏县| 博湖县| 曲松县| 监利县| 宁乡县| 葫芦岛市| 芜湖市| 铁岭县| 石楼县| 行唐县| 营山县| 宝应县| 岐山县| 伊川县| 榆中县| 南溪县| 灌云县| 孟村| 霍山县| 井研县| 特克斯县| 聊城市| 开远市| 日喀则市| 苏尼特左旗|