JavaScript闭包(二)——作用

一、延迟调用

  当在一段代码中使用 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_执行模型详解

时间: 2024-10-10 15:11:38

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

深入理解Javascript闭包(二)

一.什么是闭包? 官方的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 通俗来讲就是:Javascript中所有的function都是一个闭包.不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”.看下面这段代码: function a(){ var i=0; function b(){ alert(++i); } return b; } var c=a(); c(); 这段代码有两个特点:

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

经常被问到什么是闭包? 说实话闭包这个概念很难解释.JavaScript权威指南里有这么一段话:"JavaScript函数是将要执行的代码以及执行这些代码作用域构成的一个综合体.在计算机学术语里,这种代码和作用域额综合体叫做闭包.".言外之意所有的JavaScript函数都是闭包. 有人会说,这个解释不对.我们经常说的闭包应该像下面的一串代码: var f1 = function(){ var a=1; return function f2(){ a++; alert(a) } } v

JavaScript 闭包系列二 --- 匿名函数及函数的闭包

一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {    return 2*x;} 2)Function构造函数,把参数列表和函数体都作为字符串,不方便,不建议使用 var double = new Function('x', 'return 2*x;'); 3)函数表达式方式 var double = function(x) {    return 2*x;} 该形式中,等号右边是一个匿名函数,创建函数完毕后,将该函数赋给了变量doubl

javascript闭包以及闭包的作用

什么是闭包?--->是一个函数,一个可以访问其他函数内部数据的函数. 栗子一: function foo() { var a = 1; } function fn() { console.log(a);//报错,因为这里是无法访问到a的 } function foo() { var a = 1; function fn() { console.log(a);//这样是可以访问到a的 } return fn;//fn就是闭包,其在foo内部调用没有意义,所以将其返回,交由外部来决定调用时机,更具开

深入理解javascript闭包

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function

javascript闭包详解(内容为转载的,觉得不错就分享一下)

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

js闭包的作用

js闭包的用途详解 js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.具体怎么理解呢,各位看官请仔细看好下文 我们来看看闭包的用途.事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格:更优雅,更简洁的表达出代码:在某些方面提升代码的执行效率. 1 匿名自执行函数 我们知道所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去,这样的临时变量加入全局对象有很多坏处,比如:别的函数可能误用

浅谈JavaScript闭包

一.背景知识 在介绍闭包之前,我觉得有必要先简单的介绍一些背景知识,如变量的作用域.嵌套函数.垃圾回收机制等概念. 1.作用域 作用域是程序运行时变量可被访问的范围,定义在函数内的的变量是局部变量,局部变量的作用域只能是函数内部范围内,它不能在函数外引用.定义在模块最外层的的变量是全局变量,它是全局范围内可见的,当然在函数里面也可以读取到全局变量的. var a = 123; //全局变量 function fun(){ var b = 456; //局部变量 } 2.嵌套函数 函数不仅可以定义

Javascript闭包!

# javascript闭包(Closure) > 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 上面是官方的解释,但这解释只会让人头晕.要理解闭包,首先理解两点:变量的作用域以及作用域链,这两个在前面都已经介绍过了,并且举了简单了列子,来回顾一下: var color = "blue";       function changeColor(){              var anotherColo