重複の可能性:
javascriptの自己実行関数の目的は何ですか?
うまくいけば、非常に簡単な質問です。
自己呼び出し無名関数を使用する目的は何ですか?変数などでグローバルスコープを「汚染」するのを防ぐだけですか?または、それらを使用することには他の利点がありますか?
重複の可能性:
javascriptの自己実行関数の目的は何ですか?
うまくいけば、非常に簡単な質問です。
自己呼び出し無名関数を使用する目的は何ですか?変数などでグローバルスコープを「汚染」するのを防ぐだけですか?または、それらを使用することには他の利点がありますか?
私の個人的な経験から、スコープを誘導するために無名関数を使用する以外に、クロージャーのforループでも使用しました。これは、DOM要素がそのカウントを格納する必要があり、jQueryなどのライブラリにアクセスできない場合に役立ちます。
DIV
100個の要素があるとしましょう。最初のDIV
要素をクリックするとアラート1が表示され、同様に56番目のdiv要素をクリックするとアラート56が表示されます。
したがって、これらの要素を作成するときは、通常、次のようなことを行います
// Assume myElements is a collection of the aforementioned div elements
for (var i = 0; i < 100; ++i) {
myElements[i].onclick = function() {
alert( 'You clicked on: ' + i );
};
}
カウンターは現在99であるため、これは99を警告します。の値はi
ここでは維持されません。
ただし、匿名関数を使用して問題に取り組む場合、
for (var i = 0; i < 100; ++i) {
(function(count){
myElements[count].onclick = function() {
alert( 'You clicked on: ' + count );
};
})(i);
}
ここでは、の値i
が維持され、正しいカウントが表示されます。
変数などでグローバルスコープを「汚染」するのを防ぐだけですか?
かなり。カプセル化と可能な限り多くのグローバルな状態を回避することは、それ自体が良い目標です。
独自のスコープを作成することです。他の(たとえばグローバルな)スコープを「汚染」しなくなっただけでなく、名前の衝突の懸念や、関数/オブジェクト/メソッドの内部を突っ込みすぎたプログラマーからの防御を確実に回避できます。すべての利点の中で。また、関数が実行されたときに、参照されるオブジェクトが不要になったことをGCが簡単に理解できるようになります。
forループのクロージャも、自己呼び出し無名関数を使用します。
function attachEventsToListItems( ) {
var oList = document.getElementById('myList');
var aListItems = oList.getElementsByTagName('li');
for(var i = 0; i < aListItems.length; i++) {
var oListItem = aListItems[i];
// Watch this:
oListItem.onclick = (function(value) {
return function() {
alert(value);
}
})(i);
}
}