const secureBooking = function(){ let passengerCount = 0; return function(){ passengerCount++; console.log(`${passengerCount} passengers`); } } const booker = secureBooking(); booker(); booker(); booker();
Defn:閉包是創建 fn 的 EC 的封閉變數環境,即使在該 EC 消失之後也是如此。
此外,閉包允許 fn 存取其父 fn 的所有變量,即使在父 fn 返回之後也是如此。 fn 保留其外部作用域的引用,因此始終保留作用域鏈。
閉包確保 fn 不會失去與 fn 誕生時存在的變數的連結。它就像一個 fn 隨身攜帶的背包。這個背包具有創建 fn 的環境中存在的所有變數。
我們不必手動建立閉包。此外,我們甚至無法明確存取封閉變數。閉包不是有形的 JS 對象,即我們無法存取閉包並從中獲取變數。它是 fn 的內部屬性。要查看背包,「console.dir(booker);」
[[Scope]] 將向您展示此 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中文網其他相關文章!