如何理解JS中的闭包及其优缺点

JS面向对象面试题【七】 这一章每次面试都问,每次都是简要的说说了,总结一下:一个是紧张、二是应该利用代码中的思想来表达,三脑子不要紧张到短路,应该用自己理解的表达出来 1、说说你对闭包的理解 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念 闭包有三个特性: 1.函数嵌套函数 ... 阅读详情

答案:

简单理解就是函数中嵌套函数。我们都知道局部变量我们是无法访问的,但是通过闭包可以做到。

// 正常访问
var lan = 'zh';
function hello(){
  var name = '前端';
}
console.log(name) //很明显'undefined'

// 换成闭包
function hello(){
    var name = '前端';
    function demo(){
      console.log(name) //打印:前端
    }
}

 

详细解析:

Javascript 在函数外部自然无法读取函数内的局部变量。

function f1() {
    var n=999;
}

alert(n); // error

需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,实际上声明了一个全局变量!

 

闭包:指有权访问另一个函数作用域中的变量的函数。

理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。

在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

 

闭包的优缺点:

优点(闭包的作用):

  • ① 在函数执行完后,函数内部的变量一直存在于内存中,不会在调用结束后被垃圾回收机制回收;

  • ② 函数外部也可以读取到函数内部的变量;

缺点:

由于闭包会使用函数中的变量存在在内存中,内存消耗很大,所以不能滥用闭包;

解决的办法是:退出函数之前,将不使用的局部变量删除;

 

闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」,实现私有化。依据软件设计中的最小特权原则,应该最小限度的暴露必要内容,而将其他内容都隐藏起来。在编写面向对象的JS代码中,是无法使用传统的私有变量的,即无法让对象的属性保持对外隐藏。但是通过使用闭包就可以创建私有变量。

在这个例子中,不能直接访问私有变量counter,只能通过存取的方式获取私有变量的值。

function MyConstructor(){
    var counter = 0;
    this.getCounter = function(){
        return counter;
    }
    this.addCounter = function(){
        counter++;
    }
}

var myConstructor = new MyConstructor();
myConstructor.addCounter();
console.log(myConstructor.getCounter()); //1
console.log(myConstructor.counter);      //underfined

 

JS篇(016)-你对闭包的理解?优缺点? 答案: 概念:闭包就是能够读取其他函数内部变量的函数。 三大特性: * 函数嵌套函数。 * 函数内部可以引用外部的参数和变量。 * 参数和变量不会被垃圾回收机制回收。 优点: * 希望一个变量长期存储在内存中。 * 避免全局变量的污染。 * 私有成员的存在。 缺点: * 常驻内存,增加内存使用量。 * 使用不当会很容易造成内存泄露。 示例: ``` js function outer() { var name = "jack"; function inner() { ... 阅读详情

相关推荐

AI安全攻防:十六进制编码与表情符号如何绕过ChatGPT安全限制

在人工智能安全领域,提示词工程是影响大语言模型行为的关键技术。其核心原理在于通过精心设计的输入文本,引导模型生成特定内容或执行特定任务。这项技术的价值在于能够深入探究模型的理解机制与决策边界,对于模型优化、安全测试及功能开发具有重要意义。在实际应用场景中,研究人员常利用编码转换、符号插入等方法构造输入,以测试模型安全护栏的鲁棒性。近期,一种结合十六进制编码与表情符号的组合攻击手法受到关注,该方法通过信息伪装与语义干扰,试图绕过模型内置的内容过滤机制,这凸显了当前AI安全在输入预处理与语义理解协同防御上面临的

weixin_30633405的博客 450

什么是闭包以及优缺点

闭包: 简单的理解就是函数中套了一个函数,内层函数可以访问外层函数中的变量 有时候需要用到函数内的局部变量,在正常情况下是不能读取到的,这个时候就需要用到闭包。 闭包可以封装对象的私有属性和方法,vue 中的 data 就是一种闭包的形式。 闭包作为回调函数,可以实现函数的复用 优点:闭包因为长期驻扎在内存中。可以重复使用变量,不会造成变量污染 缺点:闭包会使函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,可能会导致内存泄露。解决方法是在退出函数之前,将不使用的变量全

lk19910323的博客 7718

COMSOL+AI实战:5个超实用技巧让你的仿真效率翻倍(附Python代码)

本文详细介绍了如何将人工智能(AI)与COMSOL仿真软件结合,通过Python脚本实现五大实用技巧,包括自动化生成数据集、构建代理模型、集成AI优化算法、利用神经网络加速场量求解以及智能结果分析,从而显著提升多物理场仿真的效率和自动化水平。

weixin_29230865的博客 443

js闭包优缺点及其应用?

1.闭包是什么? 2.闭包的优缺点 3.闭包的演示 4.详细的闭包示例 5.闭包的原理 6.闭包的使用场景 js中的使用场景

Hanah_pln的博客 2291

unity人物刚体移动_Unity3D实现2D人物移动-总结篇

背景最近研究Unity3d,2d寻路的实现。所以又一次涉及到了角色坐标位移的问题。系统的对于角色鼠标点击移动这个简单问题进行整理和总结。本来就是一个简单的几何问题,结果发现已经有两个小坑,顺便填上,这里做下总结。实现需求:通过鼠标点击,控制2d角色移动,就是点哪里,角色向移动到哪里问题分解:按照时间进行动画分解,鼠标输入(动画开始)、平移(动画进行)、移动结束(动画结束)前提:这里前面的文章基本解...

weixin_39610366的博客 1276

AutoDock Vina 对接计算(大批量)

AutoDock Vina是一种用于计算生物分子之间相互作用的计算工具,主要用于蛋白质和小分子(通常是潜在药物分子)之间的对接研究。它可以用于虚拟筛选、药物设计和生物分子结合位点的预测等多个应用领域。

MurphyStar的博客 1万+

闭包的原理和优缺点

let makeCounter = function () { let num = 0; function changeBy(val) { num += val } //给你返回什么,你才能拿什么 return { add: function () { changeBy(1) }, reduce: function () { changeBy(.

weixin_52280029的博客 5851

【AUTOSAR-DCM】-3.1-将CDD导入CFG并查看$22服务配置变化(UDS诊断DID带一个Data)

案例背景:(共8页精讲) 在《【UDS诊断描述文件CDD】-3.2-编辑CDD给$22服务创建一个带一个Data的DID(dataIdentifier)数据标识符》中,适应使用CANdela Studio在CDD中创建一个带一个Data的DID(dataIdentifier)数据标识符,见图0-1。现在我们将该CDD文件导入到CFG(DaVinci Configurator),看看配置会发生哪些变化。 图0-1 目录 1 将诊断描述文件CDD导入CFG(DaVinci Configurator.

「汽车电子助手」的博客 1633

JS中闭包的特性及其优缺点

2.还有有一个非常严重的问题,那就是内存浪费问题,这个内存浪费不仅仅因为它常驻内存,更重要的是,对闭包的使用不当会造成无效内存的产生。3.逻辑连续,当闭包作为另一个函数调用的参数时,避免你脱离当前逻辑而单独编写额外逻辑。2.在内存中维持一个变量(用的太多就变成了缺点,占内存);1.常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。5.加强封装性,可以达到对变量的保护作用。2.内部函数可以访问外部函数的变量。4.方便调用上下文的局部变量。1.保护函数内的变量安全。3.参数和变量不会被回收。...

刘鹏远 廊坊师范学院信息技术提高班17期 1172

VS2019项目使用CGAL6.1配置教程详细步骤

在VS2019项目中使用CGAL详细步骤

插件开发 331

R语言LASSO回归作图为什么X轴使用-log(λ)而不是log(λ),如何转化为log(λ)?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1015

JS闭包的作用与优缺点

一、什么是闭包 闭包是指一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。 简单来说就是指有权访问另一个函数作用域中变量的函数。 举个例子: function fn() { var num = 10; function fun() { console.log(num); } fun(); } fn(); 这就是一个闭...

m0_51371862的博客 3439

WorkBuddy CAD 审图救命课:约束、单位、尺寸链一次查清,打样前拦住返工

最危险的 CAD 文件不是打不开,而是看起来完整却混用了毫米与英寸、草图欠约束、关键尺寸没有来源。审图任务必须先列规则,再输出问题位置。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、FreeCAD 0.21.2、OpenCascade 7.7 与人工审阅组成一条可复现链路。你会从“一份模拟 STEP 文件、参数表、装配基准与审图标准”出发,得到“单位报告、约束清单、尺寸链风险表与人工复核标记”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶段。

yueyeguzhuo的专栏 265

JS闭包的理解及其优缺点

“闭包”形成的几种说法: 初级理解---《js高程》(“小红书”):闭包是指有权访问另一个函数作用域中变量的函数。(其认为闭包是一个函数) 中级理解---《 You don't know JS 》(“小黄书”):闭包是导致函数调用栈不能正常销毁的一种持续引用 (这种引用一般体现于某个函数体内其他函数的声明) 高级理解---形成闭包的真正原因是:作用域未能正常释放,变量的引用标记持续存在,即使...

jwl_willon的博客 448

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

详细解析 JavaScript 闭包

如何产生闭包? 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包 产生闭包的条件? 函数嵌套 内部函数引用了外部函数的数据(变量/函数) 注意: 闭包存在于嵌套的内部函数中 常见的闭包 将函数作为另一个函数的返回值 将函数作为实参传递给另一个函数调用 闭包的作用 使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期) 让函数外...

我是菜鸡 1594

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JS闭包的简单理解。优缺点以及垃圾回收机制

闭包是什么?·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立;所以都可以访问全局变量·为了解决函数外部无法访问函数内局部变量的问题,就在父函数中定义一个子函数并让它访问了父函数的局部变量,再通过父函数返回该子函数就实现了调用局部变量的效果;·而上面中的子函数就是闭包,所以闭包的定义是“能够读取其他函数内部变量的函数”,其实...

zhouzuoluo的博客 3345

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JavaScript闭包的理解和使用场景、闭包的优缺点,以及解决内存泄露的方法(附带案例)

JavaScript闭包的理解和使用场景、闭包的优缺点,以及解决内存泄露的方法(附带案例)

weixin_57677300的博客 950

【JavaScript高级05】JavaScript第二大神兽:闭包

1,闭包引入 编写以下代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>00_引入</title> </head> <body> <button>测试1</button> <button>测试2</button> <button>测试3&lt

qq_31539817的博客 492

闭包和垃圾回收机制

1、什么是作用域链? 作用域链:函数内部要使用变量,在函数内访问某个变量是根据函数作用域链来判断变量是否存在的,而函数作用域链是程序根据函数所在的执行环境栈来初始化的, 原型链:对象要使用某个属性, 2.什么是闭包以及闭包的使用场景,优缺点 场景:https://www.jianshu.com/p/132fb6d485ee 通过循环给页面上多个dom节点绑定事件 封装变量 延续局部变...

qq_32888087的博客 673

闭包及闭包优缺点

闭包

qq_45050686的博客 1423

JS高级概念小总结

我们可以使用let来定义变量i,let定义的变量是有块级作用域的,意味着,for循环每循环一次就会,就会为i创建一个单独的块级作用域,而setTimeou中产生的闭包会捕获并记住其所在作用域的变量,setTimeout中捕获到了不同的i值进行打印,而打印出来的自然是1 2 3 4 5 6.这里没有严格按照定义的原因是,通俗来讲,函数作为闭包的载体,是可以看得见,调用的着的东西,词法环境是较为抽象的,所以一般我们会通俗的称这个函数为闭包。闭包里的函数就相当这个宇航员,我们一看到它就知道,哦,有闭包产生了。

wcc_2006的博客 593

关于javascript的apply和call函数

====================================================== 注:本文源代码点此下载 ====================================================== 1、关于javascript的apply和call函数 prototype.js中用了大量的apply和call函数,不注意会造成理解偏差。

javazhuanzai的专栏 370

js 点击闭包_JavaScript 闭包的应用

前言面试问题:说一下对变量提升的理解说明this的几种不同的使用场景创建10个<a>标签,点击的时候弹出来对应的序号如何理解作用域实际开发中闭包的应用涉及到的知识点:执行上下文this作用域作用域链闭包执行上下文执行上下文主要有两种情况:全局代码: 一段<script>标签里,有一个全局的执行上下文。所做的事情是:变量定义、函数声明函数代码:每个函数里有一个上下文。所做的事...

weixin_28709649的博客 136

JS的三座大山之闭包(自己理解)

JS高级特性中闭包是一个特色。所谓闭包,本质就是在一个函数内部创建另一个函数。JS的百度解释: 闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 闭包的特性: ①函数嵌套函数(函数B嵌套在A的内部)(函数A返回函数B) ②函数内部可以引用函数外部的参数和变量(沿着作用域链寻找,先从自身开始查找,如果自身没有继续往上级查找,自身拥有直接调用,哪个近

大雪纷斐的博客 1151

js闭包理解与基本代码演示

浅谈JS闭包 一、闭包是什么? 简单来说,闭包就是能够读取其他函数内部变量的函数,也可以理解成函数内部的函数。 在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 通俗地讲就是别人家有一颗果树,你想吃果子但是因为权限不够吃不到(看到吃不到,实惨),但是你可以跟家里的孩子套近乎,通过他拿到你想要的果子。 这个‘别人家’就是局部作用域,外部无法访问内部变量,孩子是返回对象,对家里的 东西有访问权限,...

cocoyu99的博客 652

前端知识总结之JavaScript篇

一. this的使用场景? 普通函数中的this指向全局window 构造函数中的this指向实例对象 对象方法中调用this,this指向该方法的对象 当函数用call,apply或者bind调用时,this指向传入的对象 箭头函数中没有this,this指向外部作用域中的this 通过事件绑定方法时,this指向事件源 二. New关键字的运行机制 创建一个新的空对象 将构造函数的thi...

weixin_34248705的博客 147
上一篇: 如何理解原型链
下一篇: js继承有哪些方法
SpringRolls
博客等级 码龄9年 73粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值