一、延迟调用

  当在一段代码中使用 setTimeout 时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数。

  但是,传递函数引用的同时无法为计划执行的函数提供参数。可以在代码中调用另外一个函数,由它返回一个对内部函数的引用,再把这个对内部函数对象的引用传递给 setTimeout 函数。执行这个内部函数时要使用的参数在调用返回它的外部函数时传递。

     var outer = 'in outter';
  setTimeout(function () {
  echo(pclosure1, outer);
}, 10);

二、对Funarg上定义的多种计算方式进行定制

  “A functional argument (“Funarg”) — is an argument which value is a function.”

  函数式参数(“Funarg”) —— 是指值为函数的参数。

例如Underscore类库中的filter方法:

     _.filter([1, 2, 3, 4, 5, 6], function(num) {
return num % 2 == 0;
});
_.map([1, 2, 3], function(num){
return num * 3;
});

三、读取函数内部的变量

     function closure() {
var innerVar = 0;
function inner() {
return ++innerVar;
}
return inner;
}

通过inner将closure函数中的局部变量innerVar读取了出来。

再例如下面的Singleton 单件:

     var singleton = function () {
var _var = 10;
function _function() {
//调用私有变量_var
return _var;
} return {
first: function (a, b) {
//调用私有变量_var
return a+_var+b;
},
second: function (c) {
//调用私有函数_function
return _function() + c;
}
};
}();
echo(pclosure1, singleton.first(1, 2));//打印为13
echo(pclosure1, singleton.second(1));//打印为11

通过闭包完成了私有的成员和方法的封装。匿名主函数返回一个对象。对象包含了两个方法,方法1可以方法私有变量,方法2访问内部私有函数。匿名主函数结束的地方的"()",这是指直接执行的意思,这样才能得到return的对象。

四、让函数所占用的资源不被GC回收

     function closure() {
var innerVar = 0;
function inner() {
return ++innerVar;
}
return inner;
}
var quote = closure();
echo(pclosure1, quote());//
echo(pclosure1, quote());//

第一次引用打印的值为1,第二次引用打印的值2。
可以在上一篇《JavaScript闭包(一)——实现》中查看到没被回收的过程。

五、使用闭包的注意点

1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。

2、闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时需注意,不要随便改变父函数内部变量的值。

demo下载:

http://download.csdn.net/download/loneleaf1/8019865

参考资料:

http://www.nowamagic.net/librarys/veda/detail/1707 JavaScript闭包其一:闭包概论

http://www.nowamagic.net/librarys/veda/detail/1708 JavaScript闭包其二:闭包的实现

http://www.nowamagic.net/librarys/veda/detail/1709 JavaScript闭包其三:闭包的用法

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 简单易懂的JavaScript闭解

http://page.renren.com/601017893/note/801095804 Javascript 闭包

http://kb.cnblogs.com/page/110782/ Javascript闭包——懂不懂由你,反正我是懂了

http://coolshell.cn/articles/6731.html 理解Javascript的闭包

http://kb.cnblogs.com/page/105708/ 深入理解Javascript闭包(closure)

http://www.zhihu.com/question/20032419 动态作用域和词法域的区别是什么?

http://kangax.github.io/compat-table/es5/  ECMAScript5浏览器兼容表

http://www.nowamagic.net/librarys/veda/detail/1579 我们应该如何去了解JavaScript引擎的工作原理

http://www.ibm.com/developerworks/cn/web/1006_qiujt_jsfunctional/ JavaScript 中的函数式编程实践

http://www.cnblogs.com/fool/archive/2010/10/19/1855266.html 理解Javascript_13_执行模型详解

JavaScript闭包(二)——作用的更多相关文章

  1. 在JavaScript中闭包的作用和简单的用法

    在JavaScript中闭包的作用和简单的用法 一.闭包的简介 作用域链:在js中只有函数有作用域的概念,由于函数内能访问函数外部的数据,而函数外部不能访问函数内部的数据,由上述形成一种作用域访问的链 ...

  2. JavaScript 闭包系列二(匿名函数及函数的闭包)

    一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {     return 2*x; } 2)Function构造函数,把参数列表和函数体都作为字 ...

  3. Javascript 闭包与高阶函数 ( 二 )

    在上一篇 Javascript 闭包与高阶函数 ( 一 )中介绍了两个闭包的作用. 两位大佬留言指点,下来我会再研究闭包的实现原理和Javascript 函数式编程 . 今天接到头条 HR 的邮件,真 ...

  4. javascript闭包以及闭包的作用

    什么是闭包?———>是一个函数,一个可以访问其他函数内部数据的函数. 栗子一: function foo() { var a = 1; } function fn() { console.log ...

  5. 深入学习javaScript闭包(闭包的原理,闭包的作用,闭包与内存管理)

    前言 虽然JavaScript是一门完整的面向对象的编程语言,但这门语言同时也拥有许多函数式语言的特性. 函数式语言的鼻祖是LISP,JavaScript在设计之初参考了LISP两大方言之一的Sche ...

  6. 5.Javascript闭包得实现原理和作用

    闭包的实现原理和作用 1.闭包的概念:指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数. 2.闭包的作用:访问函数内部变量.保持函数在环境中一直存在,不会被垃圾回收机制 ...

  7. JavaScript ---- 闭包(什么是闭包,为什么使用闭包,闭包的作用)

    经常被问到什么是闭包? 说实话闭包这个概念很难解释.JavaScript权威指南里有这么一段话:“JavaScript函数是将要执行的代码以及执行这些代码作用域构成的一个综合体.在计算机学术语里,这种 ...

  8. [JavaScript闭包]Javascript闭包的判别,作用和示例

    闭包是JavaScript最重要的特性之一,也是全栈/前端/JS面试的考点. 那闭包究竟该如何理解呢? 如果不爱看文字,喜欢看视频.那本文配套讲解视频已发送到B站上供大家参考学习. 如果觉得有所收获, ...

  9. JavaScript学习总结——我所理解的JavaScript闭包

    一.闭包(Closure) 1.1.什么是闭包? 理解闭包概念: a.闭包是指有权限访问另一个函数作用域的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数,也就是创建一个内部函数,创建一 ...

随机推荐

  1. *关于httl开源Java模板的使用心得

    1.简介 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. ...

  2. Activity类生命周期

    Activity通常就是一个单独的屏幕.每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件作出响应. 从开发者角度看,Activity是一个J ...

  3. 使用的组件:JQuery UI

    jQuery UI包含了许多维持状态的小部件(Widget),因此,它与典型的 jQuery 插件使用模式略有不同.所有的 jQuery UI 小部件(Widget)使用相同的模式,所以,只要您学会使 ...

  4. Excel VBA自定义函数编写(UDF, User-Defined Function)

    虽然知道Microsoft Office Excel可以支持用VB语言来进行复杂的编程和自定义函数的编写,但是一直以来都没有这个需求. 这次遇到的问题是要根据一列数组计算出一个值,但计算过程又比较复杂 ...

  5. SQLServer 获取第几周开始日期

    不多说直接上code DECLARE @CurrDay DATETIME=GETDATE() --SET @CurrDay=CAST(('2013-01-10')AS DATETIME) --SET ...

  6. Chrome开发者工具不完全指南(六、插件篇)

    本篇是Chrome开发者工具的结尾篇,最后为大家介绍几款功能强大的插件.在chrome商店里面有很多插件,没事建议大家去逛逛.不过需要FQ,所以诸位请自备神器.一.皮肤插件 首先是大家期盼已久,翘首以 ...

  7. Java多线程8:wait()和notify()/notifyAll()

    轮询 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处 ...

  8. [.net 面向对象编程基础] (16) 接口

    [.net 面向对象编程基础] (16) 接口 关于“接口”一词,跟我们平常看到的电脑的硬件“接口”意义上是差不多的.拿一台电脑来说,我们从外面,可以看到他的USB接口,COM接口等,那么这些接口的目 ...

  9. 线程池ThreadPool知识碎片和使用经验速记

    ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行 ...

  10. ehcache2拾遗之write和load

    问题描述 在cache系统中writeThrough和writeBehind是两个常用的模式. writeThrough是指,当用户更新缓存时,自动将值写入到数据源. writeBehind是指,在用 ...