目录

  • 什么是闭包
  • 闭包是怎么产生的
  • 闭包的使用场景
  • 使用闭包的注意点

一、什么是闭包

简单来说闭包就是能够读取其他函数内部变量的函数。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

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

创建闭包最常见方式,就是在一个函数内部创建另一个函数。一个简单的闭包案例:

function F1(){var a = 29;return function(){console.log(a);}
}var a = 2;var f1 = F1();
f1();

二、闭包是怎么产生的

通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,在创建了一个闭包以后,这个函数的作用域就会一直保存到闭包不存在为止。

在javascript中,如果一个对象不再被引用,那么这个对象就会被垃圾回收机制回收;

如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。

闭包只能取得包含函数中任何变量的最后一个值

三、闭包的使用场景

最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

  1. 可以读出函数内部的变量,正常情况下,外部函数是无法读取到内部函数的变量的,所以可以说:闭包就是将函数内部和函数外部连接起来的一座桥梁,即函数作为参数传递
  2. 由于对象内的变量一直被引用,所以这对象不会被垃圾回收机制回收。可以始终保持在内存中。

四、使用闭包的注意点

  • 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

  • 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

什么是闭包,闭包是怎么产生的,闭包的应用在什么地方相关推荐

  1. 用闭包实现重载的过程学习闭包

    用闭包实现重载的过程学习闭包 let global = {overLoad:function(){} }; function Refactoring(func) {let oldFunc = glob ...

  2. python反射、闭包、装饰器_python之闭包、装饰器、生成器、反射

    1. 函数的作用域 1.在函数定义时候就固定,与调用位置无关,在调用的时候返回到函数定义的位置 x=1 #全局作用 def f1(): #整个f1函数是定义阶段 deff2():print(x)ret ...

  3. js闭包是什么?对js闭包的理解

    结合 MDN 官网中 JavaScript 章节中对闭包详解,我们需要理清的问题有,什么是闭包.闭包产生的条件.以及闭包的用途. 1.1 闭包的概念 闭包(closure)是一个函数以及其捆绑的周边环 ...

  4. 什么是闭包以及如何使用浏览器查看闭包

    什么是闭包以及如何使用浏览器查看闭包 1. 概念 我们记住两点就可以了 嵌套的内部函数 引用了外部的变量. 原因 因为变量被内部资源占用,而JS的垃圾回收机制不会回收内部函数所占的资源 导致变量一致存 ...

  5. 你不懂JS:作用域与闭包 第五章:作用域闭包

    希望我们是带着对作用域工作方式的健全,坚实的理解来到这里的. 我们将我们的注意力转向这个语言中一个重要到不可思议,但是一直难以捉摸的,几乎是神话般的 部分:闭包.如果你至此一直跟随着我们关于词法作用域 ...

  6. Swift-闭包,隐式返回、尾随闭包、值捕获、逃逸闭包、自动闭包

    闭包 闭包可以捕获和存储其所在上下文中任意常量和变量的引用,被称为包裹常量和变量. Swift 会为你管理在捕获过程中涉及到的所有内存操作. 全局和嵌套函数实际上也是特殊的闭包,闭包采用如下三种形式之 ...

  7. 从λ演算到函数式编程聊闭包(2):彻底理解JavaScript闭包规则

    闭包是很多语言都具备的特性,上篇<从抽象代数漫游函数式编程(1):闭包概念再Java/PHP/JS中的定义> 闭包的特性 闭包有三个特性: 函数嵌套函数 函数内部可以引用外部的参数和变量 ...

  8. java闭包矩阵_深刻理解Java闭包概念

    闭包又称词法闭包java 闭包最先定义为一种包含和的实体.闭包 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在.函数 解释二:闭包是函数和相关引用环境组成的实体.spa 注: ...

  9. python闭包和函数调用区别_函数闭包与可调用类

    请注意,由于之前在我的测试代码中发现了一个错误,我原来的答案是不正确的.修订版如下. 我做了一个小程序来测量运行时间和内存消耗.我创建了以下可调用类和一个闭包:class CallMe: def __ ...

  10. javascript闭包—围观大神如何解释闭包

    闭包的概念已经出来很长时间了,网上资源一大把,本着拿来主意的方法来看看. 这一篇文章 学习Javascript闭包(Closure) 是大神阮一峰的博文,作者循序渐进,讲的很透彻.下面一一剖析. 1. ...

最新文章

  1. 《3D Math Primer for Graphics and Game Development》读书笔记1
  2. java 配置嵌套事务_Spring 事务嵌套的配置
  3. 数据集_自动驾驶数据集
  4. numpy中求解范数(numpy.linalg.norm)以及各阶范数详解
  5. 1.Python基础----认识环境
  6. 《剑指Offer》面试题5-替换空格
  7. Math,Number
  8. Android studio: 自 maven 增加一個函式庫
  9. 分布式存储之Ceph软件安装及使用
  10. 计算机控制系统中采样速率的选择
  11. 还原 对于 服务器“DESKTOP-BNNIISU\SQLEXPRESS”失败。  (Microsoft.SqlServer.SmoExtended)
  12. MindManager2022注册码-激活码-序列号相关问题解答
  13. R 语言消除pdf图片的空白
  14. 小红拿到了一个数组,她想取一些数使得取的数之和尽可能大,但要求这个和必须是 k 的倍数。你能帮帮她吗?
  15. [生存志] 第60节 论语章节概览
  16. ASP.Net邮件模板编辑与发送邮件的完美实现
  17. LeetCode:390. 消除游戏————中等
  18. 远程入侵原装乘用车(中)
  19. 串起珍珠的链条——记腾讯SOSO团队
  20. 一个apk通过隐式Intent 启动另一个apk

热门文章

  1. 交易日九点到九点半的挂单撤单以及价格的一点心得
  2. adb、logcat
  3. java去除水印_Java添加、删除Word水印
  4. URL编码和Base64编码
  5. Atcoder TOYOTA SYSTEMS Programming Contest 2021(AtCoder Beginner Contest 228) C - Final Day
  6. iNavFlight之MSP v2 Sensor报文格式
  7. cas ucenter 集成
  8. java 加密word_Java 加密和解密PDF文档
  9. windows快速搜索神器everything,让你搜索文件提速百倍!
  10. php slim get,php – 在Slim上获取请求参数