javaScriptの中の閉め切った個人的な理解は、言葉が分かりやすいです.

3189 ワード

クローズドとは、文字通り一つのものを包んで使うことで目的を達成することです.
jsの中のクローズドはどうですか?
簡単に言えば、関数内で関数が作成されたときに、この関数がクローズドされます.他の関数の内部変数の関数を読み取ることができます.つまり、関数内部と外部を連結します.
簡単な例を説明します.
1         function aaa(){
2             var i = 2;
3             function bbb(){
4                 alert(++i);
5             }
6             return bbb;
7         }
8         aaa()();                 //   3
js関数のスコープがあると分かります.親オブジェクトのすべての変数は、子オブジェクトに対しては見えますが、逆は成立しません.
関数aaは関数bbをネストしています.スコープによると、関数外部は関数aa内の変数iにアクセスできないですが、このときは3がイジェクトされます.なぜかというと、これは闭锁の存在によるものです.aaa関数の呼び出しが最終的に戻ったのは関数bbです.aaa呼び出しの結果を変数に格納できます.この変数はサブコールでは定義されていません.直接aaa()です.つまりaa()はBBbを指します.
関数内の局所変数を得る必要がある場合があります.しかし、通常の場合、これはできません.関数の内部で関数を定義しているだけです.この関数は親レベルの変数とパラメータにアクセスしています.
実例を通して以下を説明する.
もし5つのliを創建するならば、私達はあるliをクリックしてこのliのインデックスを獲得したいです.ある人はきっとこの方法を試してみます.しかし、この方法で弾いた結果は全部5です.自分のインデックスを押してきたわけではありません.理由も簡単です.しかし、クリック時にforサイクルを通して、Iの値はすでに5に初期化されました.
 
    window.onload = function(){
        var li = document.getElementsByTagName('li');
        for(var i=0; i<li.length; i++){
 li[i].onclick = function(){ alert(i); }
        }
    }
何か解決策がありますか?コードを見てください.
    window.onload = function(){
        var li = document.getElementsByTagName('li');
        for(var i=0; i<li.length; i++){
(
function(index){ li[i].onclick = function(){ alert(index); } })(i);
} }
 
コードの太字部分は、运用されているクローズドです.
この方法により、各liのインデックス値が得られ、循環時のiはパラメータが自己実行関数に伝達され、このときのiはあなたに必要なiである.
クローズドの用途が多いので、また今度話します.