一、延迟调用
当在一段代码中使用 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());//1 echo(pclosure1, quote());//2
第一次引用打印的值为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_执行模型详解