探讨js闭包
背景:爱就要大胆说出来,对于编程我只想说,喜欢就大胆写出来。喜欢却不行动那就意味着失败。所以,对于在研究编程的猿们,我对同伴们说,大胆的学,大胆的写。呵呵,说这些其实无非是给我自己点动力,写下去的勇气。
今天写的是js闭包,这一个一直被我忽视的美。怎么说呢,其实之前我这人特别讨厌用闭包,为什么呢,因为习惯了写后台代码的人都知道,函数内部是不可以嵌套定义函数的。所以这一思想我之前一直没有转变,也感觉js的这样写法很“特别、很奇怪、甚至感觉没有必要,这也是我不想用的根本原因了。背景交代完毕。
额。。。好像还没有说啥是闭包了。算了,我表达能力不好,还是先从闭包的特点来解释吧,这样可能大家好理解点。
js闭包的特点:1:闭包外层是个函数。2:闭包内部都有函数。3:闭包会return内部函数。4:闭包返回的函数内部不能有return.(因为这样就真的结束了)。5:执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在。(说明:这些不是我写的,是从度娘上一位仁兄哪里拷过来的。不过我也是这么理解的。。。^_^)
简单吧、直观吧。但是这个很重要哦。大家仔细理解下。说了这么多,我还是以一个简单的例子来说明这几点吧。
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();//返回 1
c();//返回 2
看看上面这段简单的例子,这个例子也是我刚学习时候看到的,当然相信很多人如果了解过js闭包的人都有看过。例子和简单,但是用到的js闭包的思想哦。我们先来对照闭包的特点来逐一说明吧。特点一:闭包外层是个函数,这里说的就是a函数了; 特点二:闭包内部有函数,也就是b函数了。(其实这里可以直接返回function,也就是直接返回匿名函数,这里这样写也是为了大家好理解。);特点三:闭包返回b函数;特点四:b函数不能有return;特点五:这点很重要,涉及到js垃圾回收机制(GC)。这里说下js的垃圾回收机制。
在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。(摘自园友:Leo_wlCnBlogs的一篇博文中的一句话。下面也有部分转与此。小弟在此感谢!^_^)
这样看是不是感觉闭包其实也很简单啊。所以一个理解就是:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
所谓“js闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中 的临时变量。这使得只要目标 对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目 标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访问。即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新的值,和上次那次调用的是各自独立的。
js闭包的作用:简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的 执行需要依赖a中的变量。这是对闭包作用的非常直白的描述。闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。(从上面代码的运行中我们可以看出来)
使用js闭包的注意点:是不是大家看到既然闭包这么好用,那我们以后就常用闭包就好了啊,其实不然。为什么?因为从上面的js垃圾回收机制我们就可以看出,滥用闭包会导致内存消耗,导致网页加载慢等各种问题。所以,在不必要的情况下尽量少写闭包。
最后一点是对我们这些猿们的激励话吧,如果你想成为狮,请学好闭包。对了,闭包在开发插件的时候也是常用的。在接下来的jquery插件开发系列中我会着重提及到的。用园友大师的话说:理解js的闭包是迈向高级JS程序员的必经之路,理解了其解释和运行机制才能写出更为安全和优雅的代码。
如有想共同探讨、共同学习的同仁,随时联系我,QQ:296319075 ,注明园友就好,同时也希望大家也能提出宝贵意见,不吝赐教。秉承共同探讨、共同进步!如有转载,请注明出处,谢谢!^_^
探讨js闭包的更多相关文章
- 浅谈js闭包(closure)
相信很多从事js开发的朋友都或多或少了解一些有关js闭包(closure)的知识. 本篇文章是从小编个人角度,简单地介绍一下有关js闭包(closure)的相关知识.目的是帮助一些对js开发经验不是很 ...
- js闭包的作用域以及闭包案列的介绍:
转载▼ 标签: it js闭包的作用域以及闭包案列的介绍: 首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...
- 大部分人都会做错的经典JS闭包面试题
由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...
- Js闭包常见三种用法
Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...
- js闭包之初步理解( JavaScript closure)
闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...
- (原创)JS闭包看代码理解
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- js闭包理解
js闭包的作用是使函数外可以访问函数内部的变量,是通过 在函数内部 定义 访问函数内变量 的函数实现的,内部的一个函数产生一个闭包 function a() { var i=0; return fun ...
- js闭包理解实例小结
Js闭包 闭包前要了解的知识 1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...
- Js闭包的用途
本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...
随机推荐
- 【LeetCode】004. Median of Two Sorted Arrays
题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- 利用GPU实现翻页效果(分享自知乎网)
https://zhuanlan.zhihu.com/p/28836892?utm_source=qq&utm_medium=social 首发于Runtime 写文章 利用GPU实现翻页效果 ...
- Oracle存储过程创建及调用
在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储 ...
- 学习动态性能表(14)--v$parameter&v$system_parameter
学习动态性能表 第14篇--V$PARAMETER&V$SYSTEM_PARAMETER 2007.6.11 这两个视图列出的各参数项名称以及参数值.V$PARAMETER显示执行查询的se ...
- Excel分类汇总
版本:2016,数据来源:我要自学网,曾贤志老师 1.首先,要进行分类,在进行汇总, 如对日期进行汇总的话: 如果对品名进行汇总的话 2.光标要定在数据源,在选择分类字段(包含项目比如品名 ...
- (转)SC Create 创建一个Windows系统服务
本文转载自:http://blog.sina.com.cn/s/blog_62b8fc330100l9px.html C:\Users\sophiaX>sc 描述: SC 是用于与服务控制管理器 ...
- phyton方面相关书籍
0基础:<简明PYTHON教程>http://linux.chinaitlab.com/manual/Python_chinese/<与孩子一起学编程>http://book. ...
- MySQL mysqldump备份与恢复
1 用户权限 grant select,RELOAD,PROCESS,SUPER, REPLICATION CLIENT ON *.* TO 'bak'@'192.168.%' IDENTIFIED ...
- Celery-4.1 用户指南: Periodic Tasks (定时任务)
简介 celery beat 是一个调度器:它以常规的时间间隔开启任务,任务将会在集群中的可用节点上运行. 默认情况下,入口项是从 beat_schedule 设置中获取,但是自定义的存储也可以使用, ...
- [vijos1246]文科生的悲哀(二) 动态规划
背景 化学不及格的Matrix67无奈选择了文科.他必须硬着头皮艰难地进行着文科的学习. 描述 这学期的政治.历史和地理课本各有n章.每一科的教学必须按章节从前往后依次进行.若干章政治.若干章历史和若 ...