文档章节

关于闭包(做了一点修改,亲测发现原链接的结果错误,已改正)

Littlebox
 Littlebox
发布于 2017/04/05 22:49
字数 614
阅读 10
收藏 0
闭包的两个特点:

1、作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。

2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。其实上面两点可以合成一点,就是闭包函数返回时,该函数内部变量处于激活状态,函数所在栈区依然保留举例子说:

 
function a(){
   var i=0;
   function b(){
    alert(++i);
   }
   return b;
}
var c = a();
c();

这是个标准的闭包.在函数a中定义了函数b,a又return了b的值.

这些可以先不管.

var c = a();

c();

这两句执行很重要.在var c = a();这行里,执行了a函数,那么肯定a经过了return.

按照主流语言的函数特性,现在c的值就是a的返回值.

第二行c()的执行实际执行的就是b函数.最后不管执行的是谁,会弹出一个值为1的窗口,到此为止,所有的生命周期按理论来说就算全部结束了.

可是,如果我们再多执行一行.var c = a();c();c();第一次弹出1,第二次执行却弹出了2.也就是说,第一次c()后,a中的i依然保留.

自然a在内存的栈区依然保留.a是return过了,但是,a及内部值却依然存在,这就是闭包.

好了,总结下:

1,闭包外层是个函数.

2,闭包内部都有函数.

3,闭包会return内部函数.

4,闭包返回的函数内部不能有return.(因为这样就真的结束了)

5,执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在.

闭包的应用场景(呵呵,复制的参考资料):

1、保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。

2、在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。

但是用来解释javascript语言精粹中关于闭包的例子,依旧不明了。

本文转载自:https://book.douban.com/annotation/31176271/

Littlebox
粉丝 3
博文 127
码字总数 13802
作品 0
广州
程序员
私信 提问
Swift Tips:常用的知识点总结(持续更新...)

前不久发布,感觉差不多快趋于稳定了,就在工作之余把拿出来重新看了一下,总结一些常用的知识点。话说好记性不如烂笔头,放在这忘记的时候还可以拿出来瞅瞅,免得遗忘的时候到处查找,这里与...

HenryCheng
2016/06/22
0
0
关于策略研究的一点思考

一. 前言 在公司工作已经有9个月,在这九个月里,辅助上司完成了几个项目。作为一个量化新人,我的角色主要是一个执行者,要快速、准确地完成上司布置的任务。一个项目结束之后,我可能熟悉策...

Clever Liu
2016/11/12
0
0
浅谈Gradle(二)与SourceSets

之前写过了一篇Gradle(一),那是根据别人写的文章总结写的,当时其实还是很多不懂,包括我现在对gradle的理解也其实还是似懂非懂,但是还是要写,每次写完之后包括再重新多看几次,都会有新...

kylinarm
2018/06/04
0
0
每天一题(开开森森学前端之闭包笔试题)

前言 大家好,本人来在掘金待了有3个多月了,决定跟随前端大佬们的步伐,故决定每天一题记录自己的成长轨迹,由于水平有限,对于文章中出现的问题还请大佬们指正。 先来瞄看一眼这个笔试题 ...

_Dreams
04/26
0
0
关于 jsoup解析链接时出现java.nio.charset.IllegalCharsetN...

昨天做一个爬网站的程序使用Jsoup.connect(String url) 时报java.nio.charset.IllegalCharsetNameException:utf-8错误 错误内容是: java.nio.charset.IllegalCharsetNameException: UTF-8......

拌粉
2012/12/13
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
36分钟前
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部