我想了解一下javascript中闭包得具体应用,用法,适用范围?
1个回答
展开全部
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处理事件、业务逻辑处理手段,增加了模块性、封装性、问题局部化等特性。
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处理事件、业务逻辑处理手段,增加了模块性、封装性、问题局部化等特性。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询