背景:爱就要大胆说出来,对于编程我只想说,喜欢就大胆写出来。喜欢却不行动那就意味着失败。所以,对于在研究编程的猿们,我对同伴们说,大胆的学,大胆的写。呵呵,说这些其实无非是给我自己点动力,写下去的勇气。

  今天写的是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闭包的更多相关文章

  1. 浅谈js闭包(closure)

    相信很多从事js开发的朋友都或多或少了解一些有关js闭包(closure)的知识. 本篇文章是从小编个人角度,简单地介绍一下有关js闭包(closure)的相关知识.目的是帮助一些对js开发经验不是很 ...

  2. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  3. 大部分人都会做错的经典JS闭包面试题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...

  4. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

  5. js闭包之初步理解( JavaScript closure)

    闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...

  6. (原创)JS闭包看代码理解

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  7. js闭包理解

    js闭包的作用是使函数外可以访问函数内部的变量,是通过 在函数内部 定义 访问函数内变量 的函数实现的,内部的一个函数产生一个闭包 function a() { var i=0; return fun ...

  8. js闭包理解实例小结

    Js闭包 闭包前要了解的知识  1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...

  9. Js闭包的用途

    本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...

随机推荐

  1. kong插件官方文档翻译

    kong插件官方文档翻译 目录 介绍 文件结构 编写自定义逻辑 存储配置 访问数据存储 自定义实体 缓存自定义实体 扩展Admin API 编写测试 (卸载)安装你的插件 插件开发 - 介绍 什么是插 ...

  2. markdown的学习

    开始 语法 编辑器 sublime配置 图床 体验 开始 昨天晚上加上今天上午,折腾了算是一天的markdown编辑器. 原因是,为了写博客.在博客园写的东西,想法不到简书里,结果发现有部分乱码,以及 ...

  3. 洛谷【P1048】采药

    浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...

  4. python3 之 格式化json

    import json json_string = None with open("json_file.json") as f: json_string = f.read() tr ...

  5. compile cef2526

    fetch --nohooks chromium cd /path/to/chromium/src# git checkout -b 51.0.2704.103 refs/tags/51.0.2704 ...

  6. 引用 WCF 服务后,没有生成任何 .datasource?

    如题WCF服务生成成功,在添加服务引用的时候也不报错,但是添加完成之后不能正常调用服务借口. 在重新引用服务的时候,或者是是更新引用服务的时候,点“高级”按钮,在服务引用设置对话框中,将“重新使用引用 ...

  7. cassandra安装配置

    准备运行环境1.1 cassandra可以安装在windows和linux下,本例子安装在centos6.7的环境下.1.2 关闭防火墙.或者开放9042(默认的CQL本地服务端口).9160(默认的 ...

  8. Flash在线签名小程序,可回放,动态导出gif图片

    需求: 公司为了使得和客户领导签字的时候记录下来,签字过程,可以以后动态回放演示,最好是gif图片,在网页上也容易展示,文件也小. 解决过程: 始我们去寻找各种app,最终也没有找到合适的,后来我在f ...

  9. Monitoring tools that everyone's currently using

    Although a lot of new tools have arrived since 2011, it's clear that older open source tools like Na ...

  10. 深入理解Java虚拟机—JVM内存结构

    1.概述 jvm内存分为线程共享区和线程独占区,线程独占区主要包括虚拟机栈.本地方法栈.程序计数器:线程共享区包括堆和方法区 2.线程独占区 虚拟机栈 虚拟机栈描述的是java方法执行的动态内存模型, ...