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

  今天写的是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. 【转】深入剖析Java中的装箱和拆箱

    深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...

  2. 异常:idea一直刷新索引:updating index

    解决方案:File ->Invalidate Caches/restart -> Invalidate and Restart 即重新构建索引

  3. 使用base64对图片的加密解密

    import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...

  4. 对oracle中date/timestamp的操作

    设置oracle中date的会话格式为 'yyyy-mm-dd hh24:mi:ss' alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss ...

  5. Day1--Python基础1--上半部分

    一.第一个python程序 在linux下创建一个文件叫做hello.py,并输入 print "Hello World" 然后执行命令:python hello.py,输出 [r ...

  6. c# 设置水印,消除水印

    方案1: 图像处理 opencv etc 方案2: 开源框架,直接使用,已经优化 https://github.com/itext/itextsharp https://github.com/itex ...

  7. leetcode637

    层次遍历,计算每一层的节点值,然后求平均值. class Solution { public: vector<double> averageOfLevels(TreeNode* root) ...

  8. 【Android 多媒体应用】使用MediaCodec将摄像头采集的视频编码为h264

    MainActivity.java import android.app.Activity; import android.graphics.ImageFormat; import android.h ...

  9. 每天一道算法题目(18)——取等长有序数组的上中位数和不等长有序数组的第k小的数

    1.取上中位数 题目: 给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数.要求:时间复杂度O(logN).      例如:          arr1 = {1, ...

  10. latex学习

    第一段代码 \documentclass{article} \usepackage{ctex} \begin{document} \section{文字} 特可爱模板 \section{数学} \[ ...