クロージャとは何ですか、クロージャの使用シナリオについて簡単に説明してください
クロージャを理解するには、最初にJavascriptの特別な変数スコープを理解する必要があります
変数のスコープは、グローバル変数とローカル変数の2つのタイプにすぎません。
Javascript言語の特別な機能:
1.グローバル変数は関数内で直接読み取ることができます。
2.関数の外部で関数内のローカル変数を読み取ることは当然不可能です。
3.関数内で変数を宣言するときは、必ずvarコマンドを使用してください。使用しない場合は、実際にグローバル変数を宣言します。
さまざまな理由から、関数でローカル変数を取得する必要がある場合があります。ただし、前述のように、これは通常の状況では不可能であり、回避策によってのみ達成できます。
つまり、関数内に別の関数を定義することです。
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
上記のコードでは、関数f2が関数f1に含まれています。このとき、f1内のすべてのローカル変数がf2に表示されます。ただし、その逆は不可能です。f2内のローカル変数はf1には表示されません。これは、Javascript言語の独自の「チェーンスコープ」構造です。子オブジェクトは、親オブジェクトのすべての変数をレベルごとに検索します。したがって、親オブジェクトのすべての変数が子オブジェクトに表示され、その逆も同様です。
f2はf1のローカル変数を読み取ることができるので、f2が戻り値として使用されている限り、f1の外部の内部変数を読み取ることができますか?
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
前のセクションのコードのf2関数はクロージャです。
Javascript言語では、関数内のサブ関数のみがローカル変数を読み取ることができるため、クロージャーは単に「関数内で定義された関数」として理解できます。
したがって、本質的に、クロージャは関数の内側と関数の外側を接続するブリッジです。
クロージャの使用シナリオ:
1.setTimeout
ネイティブのsetTimeoutによって渡される最初の関数はパラメーターを受け取ることができず、パラメーターを渡す効果はクロージャーを介して実現できます。
2.コールバック
動作を定義し、それをユーザーイベント(クリックまたはキー押下)に関連付けます。コードは通常、コールバック(イベントがトリガーされたときに呼び出される関数)としてイベントにバインドされます。
3.機能の安定化
コールバックは、イベントがトリガーされてからn秒後に実行され、このn秒以内に再度トリガーされると、タイミングが再開されます。実装の鍵はsetTimeOut
この関数にあります。タイミングを保存するために変数も必要なので、クロージャを使用して実装できるグローバルな純度を維持することを検討してください。
4.プライベート変数をカプセル化します
即時実行機能とは何ですか?
関数を宣言し、この無名関数をすぐに呼び出すことを即時実行関数と呼びます。即時実行関数は一種の構文であり、関数が定義された直後に実行できるようにすることもできます。
(function(){
//code
}())
(function (){
//code
})()
それは何をするためのものか
- グローバル変数の汚染を避けるために関数に名前を付ける必要はありません
- 即時実行関数内に別のスコープが形成され、外部から読み取ることができないいくつかのプライベート変数をカプセル化できます。
- パッケージ変数
関数の即時実行は別のスコープを形成します。グローバル変数の汚染を回避するために、いくつかの一時変数またはローカル変数をカプセル化できます。