欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript里的闭包

程序员文章站 2022-04-19 10:54:16
...

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、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

 

闭包的作用:

       面向对象编程的成功和流行,使不支持面向的对象编程的语言也尽量往这个方向靠,如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处理事件、业务逻辑处理手段,增加了模块性、封装性、问题局部化等特性。

 

相关标签: javascript 闭包