乍一看,閉包可能看起來是一個複雜的概念,但不用擔心它們比看起來簡單得多!讓我們消除困惑並解決一些關於閉包的常見誤解。
關於閉包的常見誤解
❌ 閉包是可以存取其周圍範圍的特殊函數。
不正確
- 閉包與函數不同。
- 在 JavaScript 中,每個函數本質上都可以存取其定義的作用域。這就是函數的工作原理!
❌ 閉包需要巢狀函數。
又錯了
- 巢狀函數與建立閉包無關。
- 每當建立函數時,它都會自動與其周圍的作用域形成一個閉包,不需要巢狀。
現實是什麼❓
閉包並不是什麼神奇或獨特的功能。相反,它們只是函數和創建該函數的作用域中的變數的組合。每個函數都與此上下文捆綁在一起 - 將其視為對其來源的記憶。
這是 MDN 核准的定義:
閉包是一個函數與其周圍狀態的引用捆綁在一起的組合。
用簡單的英語來說,閉包可以讓你的函數「記住」創建它的地方的變量,即使它是在其他地方執行的。
讓我們來看看閉包的實際應用???
這是一個有趣的小例子:
function createCounter() { let count = 0; // This is the surrounding state return function() { // The inner function count++; return count; }; } const counter = createCounter(); // Create a counter instance console.log(counter()); // Output: 1 console.log(counter()); // Output: 2 console.log(counter()); // Output: 3
這裡發生了什麼事? ?
當呼叫 createCounter 時,會在其作用域內建立一個變數 count。
即使 createCounter 已經完成運行,返回的函數也會記住 count。
每次呼叫計數器時,由於閉包,它都可以存取和更新計數。
為什麼閉包很重要? ?
閉包不只是一個優秀面試的理論概念-它們非常有用!以下是一些現實世界的場景:
1. 資料隱私
閉包可以使變數保持私有並且無法從外界存取。
function secretMessage() { let message = "This is a secret!"; return function() { return message; // Only this function can access the variable }; } const getMessage = secretMessage(); console.log(getMessage()); // Output: "This is a secret!" console.log(message); // Error: message is not defined
2. 事件處理程序
當您想要「記住」某些狀態時,閉包對於事件偵聽器來說非常方便。
function greetUser(username) { return function() { console.log(`Hello, ${username}!`); }; } const greetJohn = greetUser("John"); document.getElementById("myButton").addEventListener("click", greetJohn); // Even after greetUser is done, greetJohn remembers "John"
3. 部分申請
閉包讓您可以預先設定函數的參數。
function multiply(a) { return function(b) { return a * b; // "a" is remembered }; } const double = multiply(2); console.log(double(5)); // Output: 10 console.log(double(10)); // Output: 20
等等,關閉完美嗎❓
並非總是如此!如果您不小心,閉包可能會因保留對變數的引用時間超過必要的時間而導致記憶體洩漏。例如,當在循環內部使用閉包時,很容易產生意想不到的行為:
function createCounter() { let count = 0; // This is the surrounding state return function() { // The inner function count++; return count; }; } const counter = createCounter(); // Create a counter instance console.log(counter()); // Output: 1 console.log(counter()); // Output: 2 console.log(counter()); // Output: 3
要解決此問題,您可以使用 let (區塊作用域)或 IIFE:
function secretMessage() { let message = "This is a secret!"; return function() { return message; // Only this function can access the variable }; } const getMessage = secretMessage(); console.log(getMessage()); // Output: "This is a secret!" console.log(message); // Error: message is not defined
包起來? ? ?
閉包在 JavaScript 中無所不在。無論您是否意識到,您已經在使用它們了!它們是讓 JavaScript 變得強大且靈活的秘密武器。
以下是要記住的事情: ?
- 閉包不是函數;它們是一個函數,它記得的變數。
- JavaScript 中的每個函數都有一個閉包。
- 使用閉包進行封裝、事件處理、部分應用等。
感謝您的閱讀。 ?
快樂編碼! ???✨
以上是JavaScript 中閉包的奧秘!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能