JS闭包的理解
闭包的两个特点: 1、作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。 其实上面两点可以合成一点,就是闭包函数返回时,该函数内部变量处于激活状态,函数所在栈区依然保留. 我们所熟知的主流语言,像C,java等,在函数内部只要执行了return,函数就会返回结果,然后内存中删除该函数所在的区域.生命周期也就停止了.一般的js函数也是这样.但是有闭包特性的js函数有点特殊.就例子来说: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。 根据参考资料的应用场景,我们会自然的想到java或是c++的类.虽然JS没有类的概念,但是有了类的相似执行结果. 另外,还有一种格式颇受争议:(function(a,b))(a,b);如果你使用过jquery,并且观察过他的代码,你就会很奇怪他的写法,网上有人也把这种格式叫做闭包. (0,function(a,b){return a+b;})(1,2) 这种写法,和 (function(a,b){return a+b;})(1,2) 有什么区别吗?有什么特殊意义?
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:诗诗
链接:http://www.zhihu.com/question/20318080/answer/14740912
来源:知乎
function外层的 “()” 是看作强制表达式。它默认()内部是表达式,而不是函数声明。 () 运算并返回内部表达式的结果。
第一个写法里面包含一个逗号表达式","。 它会运算每个被逗号分开的表达式并返回最后一个表达式的结果。这种写法会先计算“0”,再计算匿名函数,并返回函数引用。
第二种写法只需要运算匿名函数,所以第二种写法在效率上会更高一些。
JS闭包的理解的更多相关文章
- JS闭包的理解及常见应用场景
JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...
- 个人对js闭包的理解
闭包算是前端面试的基础题,但我看了很多关于闭包的文章博客,但感觉很多对于闭包的理想还是有分歧的,现在网上对闭包的理解一般是两种: 有些文章认为闭包必须要返回嵌套函数中里面用到外面函数局部变量的方法 ...
- 【闭包】JS闭包深入理解
先看题目代码: 1 2 3 4 5 6 7 8 9 10 11 12 function fun(n,o) { console.log(o) return { fun:function(m){ ...
- 浅谈对Js闭包的理解
理解Js的闭包,首先让我们先看几个概念 执行环境(executive environment)每个函数都有自己的执行环境,匿名函数默认为全局环境. 作用域链(scope chain)子函数继承父函数, ...
- js 闭包原理理解
问题?什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 很显然 ...
- 从循环添加事件谈起对JS闭包的理解
1.引子 相信很多初学js的人,都遇到这样一种情况:想要给一堆按钮添加各自的事件,比如点击第i个按钮时,弹出i这个值.理所当然地,我们会这样写: var buttons = document.getE ...
- js闭包的理解-目前网上分析的最透彻文章
js的闭包对于大家实际上并不陌生,但是真正敢说自己完全理解的人并不多.笔者在网上看到分析闭包的文章非常多,篇幅用的非常多,但是实际上分析的并不到位,或者根本就是不正确的.我有时候都在想,写这些文章的人 ...
- 对JS闭包的理解
闭包,是JS里很重要的一个概念,也是相对来讲不太容易理解的一个东西,不过即使难理解,我们也要迎难而上啊,嘿嘿,网上有很多文章都在讲闭包,我在看JS设计模式的时候,书里也着重讲了闭包,但是书里官方的的确 ...
- JS闭包深入理解(理解篇)
看书的时候很是不明白为啥变量老是五,经过认真思考的出一下理解: function box() { var arr = []; for (var i = 0; i < 5; i++) { ...
随机推荐
- json深度详解及org.json库
了解json (Javascript Object Notation) 网站:http://json.org/ english JSON (JavaScript Object Notation) i ...
- 匿名内部类--毕向东java基础教程学习笔记
1.匿名内部类其实就是内部类的简写形式. 2.定义匿名内部类的前提: 该内部类必须继承一个类,或者实现一个接口. 3.匿名内部类的格式:new 父类名或接口名(){定义子类内容:} 4.其实匿名内部类 ...
- Html 的实体字符大全
HTML特殊符号对照表.常用的字符实体 最常用的字符实体 显示结果 描述 实体名称 实体编号 空格 < 小于号 < < > 大于号 > > & ...
- IE6-9中tbody的innerHTML不能赋值bug
IE6-IE9中tbody的innerHTML不能赋值,重现代码如下 <!DOCTYPE html> <html> <head> <meta charset= ...
- 07_旅行商问题(TSP问题,货郎担问题,经典NPC难题)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P61 问题9: 问题描述:有n(n<=15)个城市,两两之间均有道路直接相连,给出每两个城市i和j之间的道路长度L[i][j],求 ...
- poj 2195 KM算法
题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...
- 转载的vim配置文件
""""""""""""""""&quo ...
- 【分享】iTOP-4412开发板使用之初体验[多图]
近期入手了4412开发板,配的7寸屏和WIFI模块,GPS模块,下面晒个照片介绍一下,手机拍摄图片有点模糊,实物很精致,是我所见过最好的板子.b( ̄▽ ̄)d 预装的Android4.0.3系统,5点以 ...
- SQL 第一范式、第二范式、第三范式、BCNF
作者 : Dolphin 原文地址: http://blog.csdn.net/qingdujun/article/details/27365979 一.第一范式 1NF 要求:每一个分量必须是不可分 ...
- js fs read json 文件json字符串无法解析
读取 xxx.txt(里面就是一段 json)-> JSON.parse( fs.readFileSync( xxx.txt ) ) -> 报 SyntaxError: unexpecte ...