ホームページ >ウェブフロントエンド >jsチュートリアル >jsのclosure_javascriptスキルの活用場面とメリット・デメリットの分析

jsのclosure_javascriptスキルの活用場面とメリット・デメリットの分析

WBOY
WBOYオリジナル
2016-05-16 15:53:391391ブラウズ

最初にコード:

//函数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 です。

クロージャは JavaScript 言語の主要な機能です。クロージャの主な用途は、プライベート メソッドと変数を設計することです。

これは、フレームワークを作成するときにより明白になります。一部のメソッドと属性は操作ロジック プロセスでのみ使用されるため、メソッドへのアクセスのみを提供するクロージャーを設計できます。

クロージャの欠点は、クロージャがメモリに常駐するため、不適切に使用するとメモリ リークが発生しやすいことです。

要約すると、

利点:

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]);

上記のテストを通じて、abc() を 1 万回実行して生成された同じ論理クロージャーのアドレスが同じではないことがわかります。これは、同一の Function オブジェクトが多数生成されることを意味します。ファクトリモードを利用して関数を生成して使用できるのが利点ですが、誤って通常のロジックとしてクロージャを使用すると、必然的にメモリのゴミが発生します。構文を変更すると理解しやすくなるかもしれません:

var foo = new Function();

私自身の習慣に関する限り、クロージャについては、使用する必要がある場合は、クロージャ オブジェクトの数を少なくするか、一意に保つ方法を見つけてください。

以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。