閉鎖とは何ですか?
最初にコードを見てみましょう:
関数a(){var n = 0; function inc(){n ++; console.log(n); } inc(); inc(); } a(); //コンソール出力1、次に出力2簡単です。別のコードを見てみましょう:
関数a(){var n = 0; this.inc = function(){n ++; console.log(n); };} var c = new a(); c.inc(); //コンソール出力1c.inc(); //コンソール出力2簡単です。
閉鎖とは何ですか?これが閉鎖です!
別の関数の範囲内で変数にアクセスできる関数は閉鎖です。ここで、INC関数はコンストラクターAの変数nにアクセスするため、閉鎖が形成されます。
別のコードを見てみましょう:
関数a(){var n = 0; function inc(){n ++; console.log(n); } return inc;} var c = a(); c(); //コンソール出力1c(); //コンソール出力2それがどのように実行されるか見てみましょう:
var c = couter()、この文couter()はfunction incを返し、この文はvar c = incに相当します。
c()、この文はinc()に相当します。関数名は単なる識別子(関数へのポインター)であり、()は実行関数であることに注意してください。
次の3つの文は次のように翻訳されています:var c = inc; inc(); inc();、それと最初のコードの断片に違いはありますか?いいえ。
閉鎖とは何ですか?これが閉鎖です!
すべての教科書のチュートリアルは、最後の段落を使用して閉鎖を説明することを好みますが、これは問題を複雑にしていると思います。ここで返されるのは機能名です。 Tan HaoqiangのC/C ++プログラミングを見たことがない学生は、Bringing()の違いをすぐに反映していない可能性があります。つまり、この書き込み方法にはtrapが付いています。この書き込み方法はより顕著ですが、私はまだ問題を特異にし、コード1とコード2を見るのが好きです。あなたはまだ機能の呼びかけについて混乱します、あなたはnの値について混乱しますか?
なぜこのように書く必要があるのですか?
JSの各機能は小さな黒い部屋であることがわかっています。外部情報を取得できますが、外の世界は内部のコンテンツを直接見ることができません。変数nを小さな暗い部屋に入れますが、INC関数を除き、変数nと連絡を取る方法は他にありません。さらに、機能の外側の同じ名前で変数nを定義することは、互いに影響しません。これは、「カプセル化」のいわゆる強化です。
return to return関数を識別するためにreturn to return関数を使用する必要がある理由は、INC関数をA関数の外側に直接呼び出すことができないため、Return Incは外部に関連付けられているためです。これは、コード2では、Incを外部と関連付けているだけです。
一般的なトラップ
これをチェックしてください:
関数createfunctions(){var result = new Array(); for(var i = 0; i <10; i ++){result [i] = function(){return i; }; } return result;} var funcs = createfunctions(); for(var i = 0; i <funcs.length; i ++){console.log(funcs [i]());}一見、0〜9を出力していると思いましたが、10 10を出力するとは思っていませんでしたか?
ここのトラップは次のとおりです。 ()の関数は実行機能です!単純な文var f = function(){alert( 'hi'); };ポップアップせず、次の文f();関数内のコードを実行します。上記のコードは次のように翻訳されています。
var result = new array()、i; result [0] = function(){return i; }; //関数は実行されず、関数は変更されず、関数のiを置き換えることはできません! result [1] = function(){return i; }; //関数は実行されず、関数は変更されず、関数のiを置き換えることはできません! ... result [9] = function(){return i; }; //関数は実行されず、関数は変更されず、関数のiを置き換えることはできません! i = 10; funcs = result; result = null; console.log(i); // funcs [0]()は、10console.log(i)を返すことです。 // funcs [1]()は、return iステートメントを実行することです。 // funcs [9]()は、return iステートメントを実行することです。なぜゴミ収集は結果をもたらすのですが、私はそうではありませんか?私はまだ関数によって参照されているからです。プレートが常に限られているレストランのようなものであるため、ウェイターは空のプレートをリサイクルするために台湾をパトロールしますが、まだ野菜を含むプレートをどのように収集しますか?もちろん、自分でプレートに皿(= null)を手動で注ぎ出すと、プレートは奪われます。これは、いわゆるメモリリサイクルメカニズムです。
私の価値がまだ保持される方法については、実際には、記事の冒頭からずっとそれを読むことは心配するべきではないはずです。 1つのピースを失うために、プレートの上に1枚の皿を食べる必要はありませんか?
要約しましょう
閉鎖は、関数が別の関数を指す変数です。変数が参照されるため、リサイクルされないため、プライベート変数をカプセル化するために使用できます。これは利点であり、欠点です。不必要な閉鎖は、メモリ消費量を増やすだけです!さらに、閉鎖を使用する場合、静的なプライベート変数のようなものであるため、変数の値が要件を満たしているかどうかにも注意を払う必要があります。通常、閉鎖は多くのものと混合され、より多くの理解でそれらに連絡した後にのみ、理解を深めることができます。ここでは、基本的なことについて話しているだけです。
この記事へのリンク:http://www.cnblogs.com/qieguo/p/5457040.html
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。