闭包的作用和简单案例

  1. 闭包的定义:闭包就是能够读取其他函数内部变量的函数;
    简单的理解为:一个作用域可以访问其他函数内部的局部变量;

  2. 常见的方式:一个函数内创建另外一个函数,通过另外一个函数访问这个函数局部变量,利用闭包可以突破作用域链域。(作用域链只能从下向上的方式访问)

  3. 闭包的作用:(1)可以延长作用域链,让变量始终保存在内存中不被销毁;(2)设计私有方法和变量;

  4. 闭包的缺点:闭包会常驻内存,会增大内存使用量,以用不当会造成内存泄漏;造成网页性能问题;

简单的闭包案列1

 var a = 11;function cs() {var a = 10;function cs1() {console.log(a); //cs1这个函数访问了cs函数里面的变量a,所以被访问变量的那个函数就说闭包函数,即cs()}cs1();
}
cs();

根据闭包的定义我们可以推导一下,cs1函数访问了cs函数的局部变量a,所以被访问变量的函数cs就是一个闭包函数.

简单的闭包案列2
点击li标签显示相应的索引号

<ul><li>西瓜</li><li>水蜜桃</li><li>苹果</li><li>梨</li>
</ul>
var lis = document.querySelector('ul').querySelectorAll('li');for (var i = 0; i < lis.length; i++) {lis[i].onClinck=function(){console.log(i);}}

上面代码打印的结果都是4,因为用户点击这个行为是个异步的过程,而for循环会同步把i都累加到4,然后再去执行点击这个函数,所以四次点击都是4,这个时候怎么去解决呢?
我们可以通过闭包来解决这个问题

  var lis = document.querySelector('ul').querySelectorAll('li');for (var i = 0; i < lis.length; i++) {(function(i) {lis[i].onclick = function() {console.log(i);}})(i)}

把异步函数放入到立即执行函数,异步函数就可以使用执行函数的i变量,每一次循环又创建了一个立即执行函数,所以打印结果是0,1,2,3;同理我们可以把立即执行函数里面换成定时器函数等;

闭包的作用和简单案列相关推荐

  1. 卷积神经网络概述以及简单案列

    感谢阅读 CNN概述 卷积层 卷积计算 Padding stride PyTorch 卷积层 API 池化层 经典案列图像分类 CIFAR10 数据集 模型构建 模型训练 预测 CNN概述 卷积神经网 ...

  2. 单片机中code,sbit,unsigned关键字的作用(流水灯案列说明)

    首先,写上一端单片机C语言流水灯点亮主函数 #include "reg52.h"unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0x ...

  3. java struct 简单案列_spring与struts简单整合案例

    Spring,负责对象对象创建 Struts, 用Action处理请求 Spring与Struts框架整合, 关键点:让struts框架action对象的创建,交给spring完成! 步骤: 1)引入 ...

  4. python爬虫无敌简单案列之堆糖网的图片爬取

    导入模块: import requests import urllib.parse from urllib.request import urlretrieve 输入需要搜索的内容: num = 1 ...

  5. ACL——【知识详解+案列+(RACL+VACL+PACL)】详解

    目录 一.ACL(知识讲解+简单案列应用): (1)知识详解: (2)简单案列应用: (3)调整ACL 策略(实现ACL策略穿插) (4)以字符串命名的ACL的编写与调用(常用): (5)ACL方向: ...

  6. SpringSecurity的简单使用使用案列说明

    SpringSecurity Spring Security是 Spring提供的安全认证服务的框架. 使用Spring Security可以帮助我们来简化认证 和授权的过程.官网:https://s ...

  7. 深入继承之抽象类和接口综合分析及完整案列解说(一)

    首先感谢园里的一位前辈anytao.cnblogs.com ,他对面向抽象类和接口编程作出比较完善的总结.下面的总结是直接Copy他的原话. 一.相同点 ● 都不能被直接实例化,都可以通过继承实现其抽 ...

  8. Java基础再回首之设计模式系列①-----StrategyPattern 策略者模式(案列教程,附带demo)

    一.前言 自己学java学的也熟悉了.踏入工作的不归路之后,身为一个Android开发工程师,不仅要Java基础扎实,还要对其的设计模式有所掌握,最近在群听到<Head First>这本书 ...

  9. python生成器与迭代器(配套相关案列解析用法)

    一.python生成器简介 在 Python 中,使用了 yield 的函数被称为生成器(generator).跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就 ...

最新文章

  1. 实战:使用Nginx限流
  2. 【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
  3. 最伟大最不可思议最令人感动的父亲
  4. java 反射机制性能_Java反射机制的用途和缺点
  5. 归档日志存在arch_从MYSQL 数据库归档 到 归档设计
  6. linux--exec函数族浅析
  7. 1016 部分A+B (15 分)—PAT (Basic Level) Practice (中文)
  8. 4.Zabbix企业级分布式监控系统 --- 快速配置和使用
  9. c语言文字闪烁表白,C语言表白程序1颜色变化的心
  10. Ubuntu 如何查看显卡型号
  11. Codeforces - Robot Rapping Results Report
  12. 用u盘给服务器装win7系统,用U盘装系统装Win7图文教程
  13. java sencha_Sencha Cmd 5 Java 8错误
  14. 边缘计算简介以及几款边缘计算开源平台
  15. Mac Outlook左侧文件夹不见了,怎么处理?
  16. html3D网页实例
  17. 浩方vip帐号的试用方法(转贴)
  18. 我这样来管理电脑 软件安利
  19. 细数蜂蜜的14大食疗功效
  20. 简单有限元的C++编程

热门文章

  1. 自动驾驶决策控制及运动规划史上最详细最接地气总览现状!
  2. ISCC2021-MISC_海市蜃楼-2 -WP
  3. 告别PQMagic Win7硬盘维护工具ADDS
  4. PQMagic8合并分区,文件打不开,问题解决!》
  5. C#报调用的目标发生了异常错误
  6. android 12.0 设置wifi列表黑名单(ssid不显示wifi列表)
  7. Matlab BP神经网络拟合四足机器人足端轨迹线积分方程反函数用于足端轨迹规划
  8. java captcha 验证码_利用开源组件制作验证码 Captcha
  9. 爬取糗事百科上的照片
  10. Unity 插件之 Vuforia 高通AR识别插件