javaScriptの中の閉め切った個人的な理解は、言葉が分かりやすいです.
3189 ワード
クローズドとは、文字通り一つのものを包んで使うことで目的を達成することです.
jsの中のクローズドはどうですか?
簡単に言えば、関数内で関数が作成されたときに、この関数がクローズドされます.他の関数の内部変数の関数を読み取ることができます.つまり、関数内部と外部を連結します.
簡単な例を説明します.
関数aaは関数bbをネストしています.スコープによると、関数外部は関数aa内の変数iにアクセスできないですが、このときは3がイジェクトされます.なぜかというと、これは闭锁の存在によるものです.aaa関数の呼び出しが最終的に戻ったのは関数bbです.aaa呼び出しの結果を変数に格納できます.この変数はサブコールでは定義されていません.直接aaa()です.つまりaa()はBBbを指します.
関数内の局所変数を得る必要がある場合があります.しかし、通常の場合、これはできません.関数の内部で関数を定義しているだけです.この関数は親レベルの変数とパラメータにアクセスしています.
実例を通して以下を説明する.
もし5つのliを創建するならば、私達はあるliをクリックしてこのliのインデックスを獲得したいです.ある人はきっとこの方法を試してみます.しかし、この方法で弾いた結果は全部5です.自分のインデックスを押してきたわけではありません.理由も簡単です.しかし、クリック時にforサイクルを通して、Iの値はすでに5に初期化されました.
この方法により、各liのインデックス値が得られ、循環時のiはパラメータが自己実行関数に伝達され、このときのiはあなたに必要なiである.
クローズドの用途が多いので、また今度話します.
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である.
クローズドの用途が多いので、また今度話します.