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

  今天写的是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. [转]NME Android目标中文输入问题完美解决!

    最近研究了一下haxe,发现蛮牛逼的,转几篇知识帖 haXe开发笔记:中文问题的小结 * .hx源文件中如果包含中文,要保存成UTF-8编码才能够正确被haXe编译器解析,是否包含BOM(Byte O ...

  2. Python 函数之函数调用

    Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://doc ...

  3. Mycat-server-1.6.5 常见分片方式

    Mycat-server-1.6.5 常见分片方式 1 安装 [root@hongquan1 soft]# tar zxvf Mycat-server-1.6.5-release-2018012222 ...

  4. Oracle user,role,profile常规操作--用户,权限,角色,配置文件

    Oracle user,role,profile常规操作--用户,权限,角色,配置文件 1 权限查询 1查看所有用户 SQL> select username,account_status,lo ...

  5. Java程序开发中的简单内存分析

    首先说明内存总体分为了4个部分, 包括 1.stack segment (栈区存储基本数据类型的局部变量,对象的引用名) 2.heap segment(堆区,一般用于存储java中new 出来的对象) ...

  6. 一段小程序理解getchar和putchar

    #include "stdafx.h" #include <iostream> using namespace std; int main() { char c,d,e ...

  7. 2016.1.22 利用LINQ实现DataSet内多张DataTable关联查询操作(目前未发现太大价值)

    DataSet ds = new DataSet(); DataTable t1 = DBFactorySingleton.GetInstance().Factory.GetDataTable(sql ...

  8. JavaScript基本概念B - 关于方法

    方法也是对象 这个事需要反复强调.方法是 类型 Function 的对象,和其他对象一样,它也有方法. function gen() { return function ans(factor) { r ...

  9. 第二章 深入分析Java I/O的工作机制(待续)

    Java的I/O类库的基本架构 磁盘I/O工作机制 网络I/O工作机制 NIO的工作方式 I/O调优 设计模式解析之适配器模式 设计模式解析之装饰器模式 适配器模式与装饰器模式的区别

  10. Delphi XE2 新控件 布局Panel TGridPanel TFlowPanel

    Delphi XE2 新控件 Firemonkey 布局Panel Windows平台VCl TGridPanel TFlowPanel FMX 跨平台 TLayout TGridLayout TFl ...