ホームページ >ウェブフロントエンド >jsチュートリアル >jsのclosure_javascriptスキルの活用場面とメリット・デメリットの分析
最初にコード:
//函数a function a() { var i=0; //函数b function b() { alert(++i); } return b; } //函数c var c = a(); c();
コードの機能:
1. 関数 b は関数 a 内にネストされています。
2. 関数 a は関数 b を返します。
コード中の関数 a の内部関数 b が、関数 a の外部の変数 c によって参照されることを、クロージャを作成するといいます。場合によっては、関数 b は匿名関数、つまり return function(){};
によって返されることもあります。
利点: 1. 関数内の変数のセキュリティを保護し、カプセル化を強化します。 2. 変数をメモリに保持します (使いすぎるとデメリットになり、メモリを占有します)。
クロージャがリソースを占有する理由は、関数 a が終了しても、b の実行は a の変数に依存するため、関数 a が終了しても変数 i は破棄されないためです。
このシナリオには適していません: クロージャを返す関数は非常に大きな関数です
クロージャの典型的なフレームワークは jquery です。
これは、フレームワークを作成するときにより明白になります。一部のメソッドと属性は操作ロジック プロセスでのみ使用されるため、メソッドへのアクセスのみを提供するクロージャーを設計できます。
要約すると、
利点:
1. 論理的な連続性。クロージャが別の関数呼び出しのパラメータとして使用される場合、現在のロジックから離れて追加のロジックを個別に記述することができなくなります。
2. コンテキストのローカル変数の呼び出しを容易にします。
3. カプセル化を強化することで、ポイント 2 を拡張して変数を保護できます。
欠点:
クロージャには、メモリの浪費という非常に深刻な問題があります。このメモリの浪費は、メモリに常駐しているためだけではなく、さらに重要なことに、クロージャを不適切に使用すると無効なメモリが生成されるということです。以下の例を参照してください。 :
var array = []; function abc() { var foo = function(){ } array.push(foo); return foo; } for(var i = 0 ; i < 10000; i ++) { abc(); } alert(array[0] == array[1]);
var foo = new Function();
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。