JavaScript闭包与房子

来源:互联网 发布:hadoop 8485端口 编辑:程序博客网 时间:2024/04/29 23:52

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处理事件、业务逻辑处理手段,增加了模块性、封装性、问题局部化等特性。

原创粉丝点击