ホームページ >ウェブフロントエンド >jsチュートリアル >JS のクロージャをわかりやすくする
const secureBooking = function(){ let passengerCount = 0; return function(){ passengerCount++; console.log(`${passengerCount} passengers`); } } const booker = secureBooking(); booker(); booker(); booker();
定義: クロージャは、EC がなくなった後でも、fn が作成された EC の変数環境を閉じたものです。
また、クロージャは、親 fn が戻った後でも、その親 fn のすべての変数へのアクセスを fn に与えます。 fn はその外側のスコープへの参照を保持し、それによってスコープ チェーンが常に保持されます。
クロージャは、fn が fn の誕生時に存在した変数との接続を失わないことを保証します。それは、fnがどこに行くにも持ち歩くバックパックのようなものです。このバックパックには、fn が作成された環境に存在していたすべての変数が含まれています。
クロージャを手動で作成する必要はありません。また、クローズドオーバー変数に明示的にアクセスすることもできません。クロージャは有形の JS オブジェクトではありません。つまり、クロージャに到達してそこから変数を取得することはできません。これは fn の内部プロパティです。バックパックを確認するには、「console.dir(booker);」
[[スコープ]] は、この fn 呼び出しの VE について表示します。
[[]] は、コードからアクセスできない内部プロパティであることを意味します。
クロージャを作成するために、別の fn から fn を返す必要は常にありません。以下の例では、変数 'f' はグローバル スコープ内にあるため、fn 内でも定義されていません。 g() が EC を終了した後でも、変数 'a' にアクセスできます。 「a」は今「f」のバックパックの中にいます。
let f; const g = function(){ const a = 23; f = function() { console.log(a*2); // 46 }; }; const h = function(){ const b = 777; f = function(){ console.log(b*2); // 1554 }; }; g(); f(); console.dir(f); // f fn is reassigned using h fn. Hence, old closure value i.e 'a' will be replaced with new value 'b' which can be verified using console.dir(). h(); f(); console.dir(f);
// Boarding Passengers using Closures const boardPassengers = function(n, wait){ const perGroup = n / 3; setTimeout(function(){ console.log(`We are now boarding all ${n} passengers`); console.log(`There are 3 groups, each with ${perGroup} passengers`) }, wait*1000); console.log(`Will start boarding in ${wait} seconds`); } boardPassengers(180, 3);
以上がJS のクロージャをわかりやすくするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。