なぜクローズドを使うのですか?

3191 ワード

本文の一部の内容はhttp://www.jcodecraeer.com/a/jquery_jsajaxjishu/2012/0628/290.およびhttp://www.cnblogs.com/rubylouvre/archive/2009/07/24/1530074.html
クローズドとは、関数内にもう一つの関数を書くことです。すなわち、関数の入れ子です。内部関数は外部関数の変数を呼び出すことができます。
コードの例:
function checkClosure(){  
    var str = 'rain-man';  
    setTimeout(  
        function(){ alert(str); } //          
    , 2000);  
}  
checkClosure();
ではなぜクローズドを使って、クローズドを使うメリットがありますか?
1、コードの理解がしやすい
2、グローバル変数を減らす声明
3、キーの値が前の段階の関数の実行に従って完成しないことを保証し、廃棄する。
コードの理解に便利です。
コードの例:
function forTimeout(x, y){  
    alert(x + y);  
}  
function delay(x , y  , time){  
    setTimeout('forTimeout(' +  x + ',' +  y + ')' , time);      
}  
/**  
 *    delay        ,      ,                   
 * function delay(x , y , time){  
 *     setTimeout(  
 *         function(){  
 *             forTimeout(x , y)   
 *         }            
 *     , time);     
 * }  
 */
グローバル変数を減らす宣言
コードの例:
var oEvent = {};  
(function(){   
    var addEvent = function(){ /*        */ };  
    function removeEvent(){}  
     
    oEvent.addEvent = addEvent;  
    oEvent.removeEvent = removeEvent;  
})();
はこのコードの中で関数addEventとremoveveveveveveveveveveventはすべて局所変数ですが、大域変数oEventを通じてそれを使うことができます。これは大域変数の使用を大幅に減らして、ウェブページの安全性を高めました。私たちはこのコードを使いたいです。oEvent.addEvent(document.getElement ById),'click',function();;
ただし、クローズドで使用される親関数の変数は、グローバル変数の最終値です。例を挙げます
/**  
 * <body>  
 * <ul>  
 *     <li>one</li>  
 *     <li>two</li>  
 *     <li>three</li>  
 *     <li>one</li>  
 * </ul>  
 */
     
var lists = document.getElementsByTagName('li');  
for(var i = 0 , len = lists.length ; i < len ; i++){  
    lists[ i ].onmouseover = function(){  
        alert(i);      
    };  
}
このプログラムが実行された後、私達が欲しいのではなく、4つの4つの4つがイジェクトされました。mouseoverイベントが傍受関数を呼び出すと、まず匿名関数(function(){alert(i)}で)内部検索はiを定義しているかどうか、結果は定義されていません。したがって、検索結果は既に定義されており、iの値は4(ループ後のi値)である。だから、最後に毎回弾いたのは4です。
上記の問題は以下の方法で解決できます。
var lists = document.getElementsByTagName('li');  
for(var i = 0 , len = lists.length ; i < len ; i++){  
    (function(index){  
        lists[ index ].onmouseover = function(){  
            alert(index);      
        };                      
    })(i);  
}
キーの値が前のレベルの関数の実行に従って完成しないことを保証します。破壊します。
司徒正美さんは「クローズドとは、もう一つの機能領域に保存されています。上の関数または作用領域から取得した変数(キーの値ペア)のことです。これらのキーの値は、前の関数の実行に従って完成しないので、破壊されます。Javascriptには閉じられています。2つの特徴があります。2、一つのクローズドは、一つの関数が戻った時に、リソースを解放していないスタックエリアです。
例をあげる
//*************  uniqueID************* 


uniqueID = (function(){ //             


    var id = 0; //           


    //                      


    //          uniqueID      . 


    return function(){return id++;};  //  ,  . 


})(); //          .  


document.writeln(uniqueID()); //0 


document.writeln(uniqueID()); //1 


document.writeln(uniqueID()); //2 


document.writeln(uniqueID()); //3 


document.writeln(uniqueID()); //4