JavaScript閉包(二)——做用

1、延遲調用

  當在一段代碼中使用 setTimeout 時,要將一個函數的引用做爲它的第一個參數,而將以毫秒錶示的時間值做爲第二個參數。javascript

  可是,傳遞函數引用的同時沒法爲計劃執行的函數提供參數。能夠在代碼中調用另一個函數,由它返回一個對內部函數的引用,再把這個對內部函數對象的引用傳遞給 setTimeout 函數。執行這個內部函數時要使用的參數在調用返回它的外部函數時傳遞。html

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

 

2、對Funarg上定義的多種計算方式進行定製

  「A functional argument (「Funarg」) — is an argument which value is a function.」java

  函數式參數(「Funarg」) —— 是指值爲函數的參數。git

例如Underscore類庫中的filter方法:github

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

 

3、讀取函數內部的變量

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

經過innerclosure函數中的局部變量innerVar讀取了出來。web

再例以下面的Singleton 單件:shell

     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的對象。編程

 

4、讓函數所佔用的資源不被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閉包(一)——實現》中查看到沒被回收的過程。瀏覽器

 

5、使用閉包的注意點

一、因爲閉包會使得函數中的變量都被保存在內存中,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露。閉包

二、閉包會在父函數外部,改變父函數內部變量的值。因此,若是你把父函數看成對象(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_執行模型詳解

相關文章
相關標籤/搜索