有关闭包的概述及优缺点

有关闭包的概述及优缺点一 闭包是什么 一个函数和对其周围状态 lexicalenvir 词法环境 的引用捆绑在一起 或者说函数被引用包围 这样的组合就是闭包 closure 也就是说 闭包让你可以在一个内层函数中访问到其外层函数的作用域 functioninit varname Mozilla name 是一个被 init 创建的局部变量 functiondisp displayName 是内部函数 一个闭包

目录

一、闭包是什么:

二、闭包的用途有些什么:

三、闭包的缺点:

如何避免闭包引起的内存泄漏:


一、闭包是什么:

一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。

二、闭包的用途有些什么:

1.模仿块级作用域

所谓块级作用域就是指在循环中定义的变量,一旦循环结束,变量也随之销毁,它的作用范围只在这一小块。而在JavaScript中没有这样的块级作用域,由于JavaScript不会告诉你变量是否已经被声明,所以容易造成命名冲突,如果在全局环境定义的变量,就会污染全局环境,因此可以利用闭包的特性来模仿块级作用域。

function X(num) { (function(){ for(var i = 0; i < num.length; i++){ num++ } }).call() //声明一个函数立即调用以后,浏览器刷新页面会报错,可以用一个小括号把整段函数包起来。 console.log(i)//undefined } 

在上面的代码中,闭包就是那个匿名函数,这个闭包可以当函数X内部的活动变量,又能保证自己内部的变量在自执行后直接销毁。这种写法经常用在全局环境中,可以避免添加太多全局变量和全局函数,特别是多人合作开发的时候,可以减少因此产生的命名冲突等,避免污染全局环境。

2.储存变量

闭包的另一个特点是可以保存外部函数的变量,内部函数保留了对外部函数的活动变量的引用,所以变量不会被释放。

function S(){ var a = 1 return { function(){ renturn a } } } var d = S() // 100 

这种写法可以用在把一些不经常变动计算起来又比较复杂的值保存起来,节省每次的访问时间。

3.封装私有变量

我们可以把函数当作一个范围,函数内部的变量就是私有变量,在外部无法引用,但是我们可以通过闭包的特点来访问私有变量。

var person = function(){ //变量作用域为函数内部,外部无法访问 var name = "default"; return { getName : function(){ return name; }, setName : function(newName){ name = newName; } } }(); print(person.name);//直接访问,结果为undefined print(person.getName()); // default person.setName("abruzzi"); print(person.getName()); // abruzzi

三、闭包的缺点:

1、对内存消耗有负面影响,因内部函数保存了对外部变量的引用,导致无法被垃圾回收,增大内存使用量,所以使用不当会导致内存泄漏。

2、对处理速度具有负面影响。闭包的层级决定了引用的外部变量在查找时经过的作用域长度。

3、可能获取到意外的值。

如何避免闭包引起的内存泄漏:

在退出函数之前,将不使用的局部变量全部删除,可以使变量赋值为null

//这段代码会导致内存泄露 window.onload = function(){ var el = document.getElementById("id"); el.onclick = function(){ alert(el.id); } } //解决方法为 window.onload = function(){ var el = document.getElementById("id"); var id = el.id; //解除循环引用 el.onclick = function(){ alert(id); } el = null; // 将闭包引用的外部函数中活动对象清除 }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222655.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:16
下一篇 2026年3月17日 下午3:17


相关推荐

  • nginx负载均衡的原理简介_负载均衡原理

    nginx负载均衡的原理简介_负载均衡原理1、Nginx负载均衡的原理是什么?​客户端向反向代理发送请求,接着反向代理根据某种负载机制转发请求至目标服务器(这些服务器都运行着相同的应用),并把获得的内容返回给客户端,期中,代理请求可能根据配置被发往不同的服务器。2、Nginx负载均衡的作用是什么?​负载均衡:分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服…

    2022年10月9日
    4
  • JAVA重写和重载的区别「建议收藏」

    JAVA重写和重载的区别「建议收藏」问:Java重载与重写是什么?有什么区别?答:  重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。图1.Android…

    2022年7月8日
    18
  • xshell的安装和使用_Xshell命令

    xshell的安装和使用_Xshell命令Xshell安装Xshell安装完后提示更新到最新版本

    2025年10月10日
    5
  • slimdx 安装方法

    slimdx 安装方法想安装 slimdx 找了很长时间没有 sdk 于是发现 nuget 也可以安装链接 https www nuget org packages SlimDX 4 0 13 43 amp amp amp amp amp amp amp amp amp amp amp Install PackageSlimD Version4 0 13 43

    2026年3月19日
    2
  • java一句话木马_jsp一句话木马总结

    java一句话木马_jsp一句话木马总结Jsp7 include 指令 index jsp pagecontentT text html charset UTF 8 htmlheadtitl 指令 title headbody 关于 include 指令 1 a jsp 可以将 b jsp 包含进来 当然被包含的资源不一定是 jsp 也可能是其它的网络资源 2 include 作用 在网页中有一些

    2026年3月18日
    2
  • 手机写java_手机怎么写java

    手机写java_手机怎么写java手机怎么写java通常我们写java程序都是在电脑上,很少在手机上写程序,因为手机屏幕小,写起来不方便,而且ide也没有电脑的好用。但手机相对来说比较便捷,随时随地就可以写代码,练练手,下面就介绍一下如何在手机上写java程序吧。1、下载安装软件软件名:JavaN-IDE-AndroidBuilder-JavaSECompiler2、进入软件刚开始进入时,会提示你创建工程、包名、主方法类,…

    2022年7月9日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号