当前位置: 首页 > news >正文

JavaScript 闭包

先看一段代码:
function a()
{
    var i=0;
    function b()
    {
        alert(++i);
    }
    return b;
}

var c=a();
// 显示1
c();

// 显示2
c();

//显示3
c();

var d=a();
// 显示1
d();
// 显示2
d();

当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。

那么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。

闭包的应用场景

  1. 保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
  2. 在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
  3. 通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)

这里有一个链接讲的比较全

http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html

相关文章:

  • 一台笔记本烦人
  • 一起学DHCP系列(七)租约、释放
  • 没事常看看
  • 数据链路层plus——TCP/IP Review
  • [转]NHibernate文章转载
  • 解决方案:诊断帐号被Lockout的原因
  • 深入解析跨站请求伪造漏洞(转)
  • 邮件服务器解决方案
  • Linux VNC Server多用户访问设置
  • 定制扑克有几大优势
  • 常见的开放源代码许可证类型
  • Windows server 2003DFS文件服务器的配置
  • Delphi IDE扩展开发向导
  • 查看Windows 2003系统日志的简单办法
  • 简单cdn
  • bearychat的java client
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js递归,无限分级树形折叠菜单
  • passportjs 源码分析
  • 创建一种深思熟虑的文化
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 算法-插入排序
  • 一天一个设计模式之JS实现——适配器模式
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 用简单代码看卷积组块发展
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #微信小程序:微信小程序常见的配置传值
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • %check_box% in rails :coditions={:has_many , :through}
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (九)c52学习之旅-定时器
  • (蓝桥杯每日一题)love
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (算法)前K大的和
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET CF命令行调试器MDbg入门(一)
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net 调用php,php 调用.net com组件 --
  • .net程序集学习心得
  • .net和php怎么连接,php和apache之间如何连接
  • .NET开发人员必知的八个网站
  • .NET面试题(二)
  • .Net中的设计模式——Factory Method模式
  • @Controller和@RestController的区别?