JavaScriptの中のクローズド.

2743 ワード

JavaScriptでは、簡単に、一つのクローズドは、保留されたロールドメインとして記述することができる.少なくともこれは私が理解しているクローズドの意味です.実際にクローズドされる利点は、外部実行環境の役割領域を保持することにある.このような行為は多くの異なる方法で使用でき、多くのJavascript欠陥に対処する効果的な救済方法となっている.最も一般的なのは「循環問題」です.
循環体内で関数を作成して、新しい関数の内部にある変数の現在の値を維持してください.あなたの新しい関数が呼び出される前にも、循環環境はこの変数の値を変えました.新しい関数の内部にこの変数の値を残してほしいです.次はその例です.
var myElements = [ /* DOM Collection */ ];
for (var i = 0; i < 100; ++i)
 {
myElements[i].onclick = function() {alert( 'You clicked on: ' + i );}
;}
myElements[0].onclickが触発されると、iの値は99になります.これは、あなたがその要素をクリックしても、あなたがもらえるという意味です.「You clicked on:99」です.これは関数を作成し、各サイクルの反復にこの関数を呼び出して解決できます.iに入ると、呼び出し関数は新しい実行環境を形成します.この実行環境においてiの値を保存し、どの環境内でも任意の方法で使用できます.これらの方法は戻ります.関数
function getHandler(n) {return function() {alert( 'You clicked on: ' + n );};}for (var i = 0; i < 100; ++i) {myElements[i].onclick = getHandler(i);}
今はこのプログラムが正常に動作します.使える共通の近道は、関数の作成と呼び出しを同時に行うことです.ここでは「自分で呼び出した匿名関数」が使えます.
for (var i = 0; i < 100; ++i) 
{
myElements[i].onclick = (function(n) {return function() {alert( 'You clicked on: ' + n );};})(i);
}
彼は非常に簡明なので、もっと通用しています.彼はとてもクールに見えます.しかし、前の方法はもっと速いかもしれません.あなたはget Handler関数を一回作成しただけです.反復ごとに作成するのではありません.
注意:継承された作用域の変数を再ロードしないのは良い習慣ですが、関数にiが入ってきた場合は、異なるマーカー(n)を使用する必要はありません.
もう一つの一般的なクローズドは、Yahoo(またはCrockFords)のモジュールモードを使用しています.
var someCoolModule = (function() {var privateVariable = 12345;
return {doSomething: function() {alert( privateVariable );},doSomethingElse: function() {// ...}}})();
「Function(){}」の周りの第一のペアは必須ではないが、より明確な説明関数を使ってすぐに呼び出されるので、式はその関数に戻る必要はなく、その関数の値を返すことができることが明らかになった.
モジュールモードを使用することにより、公有と同様の変数または方法を作成することができます.戻ってきた関数は親関数のスコープを継承しているので、彼はその実行環境のすべての変数にアクセスすることができます.
クローズドは、関数が呼び出される度に同じリソースを使う場合もあります.呼出しごとに同じリソースを作成するので、効率が非常に低いです.
function doSomething() {var regex = /[^\[](.+?)\.$/;/* Do other stuff ... */}
正規表現は関数呼び出しでは変えられないので、他の場所に置いてもいいです.公開されていないプライベートドメインに隠すよりいいものがありますか?
var doSomething = (function(){var regex = /[^\[](.+?)\.$/;return function() {/* Do someting with "regex"... */};})();
他にもいくつかの効果的なクローズドアプリケーションがあれば、シェアしてほしいです.
住所: http://james.padolsey.com/javascript/closures-in-javascript/
  http://www.cssrain.cn/article.asp?id=1385