欢迎来到天天文库
浏览记录
ID:30777280
大小:54.00 KB
页数:6页
时间:2019-01-03
《javascript中闭包的写法和作用详解_javascript技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、JavaScript中闭包的写法和作用详解1、什么是闭包闭包是有权访问另一个函数作用域的变量的函数。简单的说,Javascript允许使用内部函数一-即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所冇局部变量、参数和声明的其他内部函数。当英屮一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。2、变量的作用域要理解闭包,首先要理解变量的作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊Z处,就在于函数内部可以直接读取全局变量。其中
2、内部函数中可以访问外部函数的变量,是因为内部函数的作用域链中包含了外部函数的作用域;也叮以理解为:内部函数的作用范围辐射到了外部函数的作用范围;varn=999;functionfl(){alert(n);}fl0;//999另一方而,在函数外部自然无法读取函数内的局部变量。functionfl(){varn=999;}alert(n);//error这里有一个地方需要注意,函数内部声明变量的时候,一定要使用v肛命令。如果不用的话,你实际上声明了一个全局变量!functionfl(){n=999;fl0;alert(n);//99
3、93、闭包的几种写法和用法3.1、给函数添加一些属性functionCircle(r){this,r=r;}Circle.PI二3.14159;Circle,prototype,area二function(){rcturnCirclc.PI*this.r*this.r;}varc=newCircle(1.0);alert(c.area());//3.141593.2、是声明一个变量,将一个函数当作值赋给变量varCircle=function(){varobj=newObject();obj.PI=3.14159;obj.eirc
4、Ei=function(r){returnthis・Pl*r*r;}returnobj;}varc=newCircleO;alert(c.area(1.0));//3.141593.3、这种方法使用较多,也最为方便。varobj二{}就是声明一个空的对象varCircle={〃PI〃:3・14159,,zarea,z:function(r){returnthis.PI*r*r;}};alert(Circle.arca(l.0));//3.141594、闭包的主要作用闭包可以用在许多地方。它的最大用处冇两个:一个是前而捉到的可以读取
5、函数内部的变量,另一个就是让这些变量的值始终保持在内存中。4.1、如何从外部读取局部变量?出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。functionfl(){varn=999;functionf2(){alert(n);//999}}在上面的代码中,函数f2就被包括在函数fl内部,这时fl内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对fl就是不可见的。这就是Javascript语言特
6、有的"链式作用域"结构(chainscope),了对彖会一级一级地向上寻找所有父对彖的变量。所以,父对象的所冇变量,对子对彖都是可见的,反之则不成立。既然f2可以读取fl中的局部变量,那么只要把f2作为返冋值,我们不就可以在fl外部读取它的内部变量了吗!functionfl(){varn二999;functionf2(){alert(n);}returnf2;}varresult=f1();result();//9994.2、如何将变量的值始终保存在内存当中?functionfl(){varn二999;□Add二function(
7、){n+二1}functionf2(){alert(n);}returnf2;}varresult=f1();result();//999nAdd();result();//1000在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000o这证明了,函数fl中的局部变量n—直保存在内存小,并没有在fl调用后被自动清除。为什么会这样呢?原因就在于fl是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于fl,因此fl也始终在内存中,不会在调用结束后,
8、被垃圾冋收机制(garbagecollection)冋收。这段代码中另一个值得注意的地方,就是二function(){n+二1}〃这一行,首先在nAddm面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿
此文档下载收益归作者所有