博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript中的闭包
阅读量:6936 次
发布时间:2019-06-27

本文共 878 字,大约阅读时间需要 2 分钟。

hot3.png

function f1() {			var n = 999;			function f2() {      				alert(n);     			}			return f2;		}var result = f1();result(); // 999

像这样通过f1这个函数就调用f2, 而且f2还能够访问到f1中定义的局部变量n, 那么这样的代码就是一个闭包。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

function f1(){    var n=999;    nAdd=function(){n+=1}    function f2(){      alert(n);    }    return f2;  }var result=f1();result(); // 999nAdd();result(); // 1000

在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

转载于:https://my.oschina.net/u/266531/blog/805153

你可能感兴趣的文章
35岁以前成功的12条黄金法则
查看>>
VVOL、VASA — 为什么如此重要
查看>>
Linux的cat、more、less有什么区别
查看>>
protobuf 2.5.0 编译jar
查看>>
TextInputLayout
查看>>
tcp wrapper
查看>>
成为技术领导者——解决问题的有机方法
查看>>
Netscape Mozilla源代码指南
查看>>
设计模式-装饰模式
查看>>
spring整合hibernate(注解、xml)applicationContext.xml配置
查看>>
用UltraISO制作U盘启动盘,支持windows 7
查看>>
android sqlite 中 创建表 不要使用 "IF NOT EXISTS " + TA...
查看>>
设置系统的viewController modal动画样式
查看>>
【优达学城测评】SELECT 子句(6)
查看>>
推荐!国外程序员整理的Java资源大全
查看>>
Hugo快速搭建Blog
查看>>
SQLite 删除表
查看>>
【Python】Numpy扩充数组函数之repeat和tile用法
查看>>
查找和排序相关
查看>>
InnoDB的MVCC如何解决幻读
查看>>