一、什么是闭包以及闭包的几种写法和用法1、什么是闭包?包含这些变量的环境表达式(通常是函数),因此这些变量也是表达式的一部分。闭包的特点:1.作为函数变量的引用,当函数返回时,它是活跃的。2.闭包是函数返回时不释放资源的栈区。简单地说,Javascript允许使用内部函数——即在另一个函数体内的函数定义和函数表达式。此外,这些内部函数可以访问在它们所在的外部函数中声明的所有局部变量、参数和其他内部函数。当这些内部函数之一在包含它们的外部函数之外被调用时,就会形成闭包。2.闭包的几种写法和使用方式首先我们要明白JS中万物皆对象,函数是对象的一种。我们先来看看闭包的五种写法,简单了解一下什么是闭包。稍后将详细解释。//第一种写法functionCircle(r){this.r=r;}Circle.PI=3.14159;Circle.prototype.area=function(){returnCircle.PI*this.r*this.r;}varc=newCircle(1.0);警报(c.area());这种写法并没有什么特别之处,只是给函数增加了一些属性。//第二种写法varCircle=function(){varobj=newObject();obj.PI=3.14159;obj.area=function(r){returnthis.PI*r*r;}返回对象;}//这里推荐一个前端全栈开发交流圈:619586920突破技术瓶颈,提升思维能力varc=newCircle();警报(c.area(1.0));这种写法就是声明一个变量,将一个函数作为一个值赋给一个变量。//第三种写法varCircle=newObject();Circle.PI=3.14159;Circle.Area=function(r){returnthis.PI*r*r;}alert(Circle.Area(1.0));这个第一种方法最好理解,就是new一个对象,然后给对象添加属性和方法。//第四种写法varCircle={"PI":3.14159,"area":function(r){returnthis.PI*r*r;}//这里推荐一个前端全栈开发交流圈:619586920突破技术瓶颈,提升思维能力};警报(圆形区域(1.0));这种方法应用广泛,也是最方便的。varobj={}声明一个空对象。//第五种写法varCircle=newFunction("this.PI=3.14159;this.area=function(r){returnr*r*this.PI;}");alert((newCircle()).area(1.0));说实话,我没用过这种写法,大家可以参考一下。一般来说,以上方法中,第二种和第四种方法比较常见,大家可以根据自己的习惯来选择。上面代码中出现了JS中常用的Prototype,那么Prototype有什么用呢?让我们看一下:vardom=function(){};dom.Show=function(){alert("显示信息");};dom.prototype.Display=function(){alert("属性消息");};dom.Display();//错误dom.Show();vard=newdom();d.显示();d.显示();//error我们先声明一个变量,一个函数赋值给他,因为Javascript中每个函数都有一个Portotype属性,而对象没有。添加两个方法,直接分别添加和添加breakPrototype,看调用情况。分析结果如下:1.prototype属性没有定义的对象方法是静态方法,只能用类名直接调用!另外,不能在这个静态方法中使用这个变量来调用对象的其他属性!2.prototype属性定义的对象方法是非静态方法,必须实例化后才能使用!在其方法内部,this可用于引用对象本身的其他属性!这次给大家推荐一个免费的学习圈,总结了移动应用网站开发,css,html,webpack,vuenodeangular,面试资源。获取信息???对web开发技术感兴趣的同学欢迎加裙子:???582735936???,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效学习路线和教程免费分享给你,视频资料每天更新。最后祝大家早日学业有成,拿到满意的offer,快速升职加薪,走上人生巅峰。我们再看一段代码:vardom=function(){varName="Default";this.Sex="男孩";this.success=function(){alert("成功");};};警报(dom.Name);警报(dom.Sex);我们先来看一下,会显示什么?答案是都显示Undefined,为什么呢?这是因为Javascript中的每个函数都形成了一个作用域,而这些变量都是在函数中声明的,所以都在这个函数的作用域内,外部是无法访问的。如果你想访问变量,你必须创建一个新的实例。varhtml={Name:'Object',Success:function(){this.Say=function(){alert("Hello,world");};alert("目标成功");}//这里给大家推荐一个前端全栈开发交流圈:619586920,突破技术瓶颈,提升思维能力};我们来看看这种写法。其实这是Javascript的一个“语法糖”。这种写法等价于:varhtml=newObject();html.Name='对象';html.Success=function(){this.Say=function(){alert("Hello,world");};alert("目标成功");变量html是一个对象,不是函数,所以没有Prototype属性,它的方法都是public方法,不能实例化html。否则会出现如下错误:但是他可以作为一个值赋值给其他变量,比如varo=html;我们可以这样使用它:alert(html.Name);html.Success();说到这里,就结束了?细心的人会问,如何访问Success方法中的Say方法?是html.Success.Say()吗?当然不是,我上面说了,由于范围的限制,是无法访问的。所以使用下面的方法访问:vars=newhtml.Success();s.Say();//也可以写在外面html.Success.prototype.Show=function(){alert("HaHa");};vars=newhtml.Success();s.Show();关于Javascript的范围,一两句话说不清楚。如果你有兴趣,你可以在网上找一些资料。二、Javascript闭包的使用其实通过使用闭包,我们可以做很多事情。比如模拟面向对象的代码风格;更优雅简洁地表达代码;在某些方面提高代码执行效率。1.匿名自执行函数我们知道所有的变量。如果不加var关键字,则默认添加到全局对象的属性中。将这样的临时变量添加到全局对象中有很多缺点,例如:其他函数可能会误用这些变量;全局对象太大,影响访问速度(因为需要从原型链遍历变量的值)。除了每次使用变量时都使用var关键字外,在实际情况中我们经常会遇到这样的情况,即有些函数只需要执行一次,其内部变量不需要维护,比如UI初始化,然后我们可以使用Closure:vardata={table:[],tree:{}};(function(dm){for(vari=0;i
