搜尋
首頁web前端js教程JavaScript 閉包:初學者指南

閉包是 JavaScript 中強大的重要功能,許多初學者都對此感到困惑。它們負責 JavaScript 的幾個最有用的功能,例如跨函數呼叫儲存狀態和建立私有變數。本部落格試圖透過將閉包分解為簡單的語言並透過實際範例討論其重要性來解釋閉包。

?什麼是閉包?

當一個函數從 JavaScript 中的另一個函數傳回時,它會繼承父函數的作用域。這意味著即使外部函數已完成執行,返回的函數也可以存取外部函數作用域中定義的變數。 閉包是函數及其封閉範圍的組合。
這是一個更簡單的定義:

  • 閉包是一個函數,「記住」來自外部(封閉)函數範圍的變數。
  • 即使外部函數不再執行,內部函數也可以存取這些變數。

?閉包如何運作:一個例子

?沒有閉包的範例

function outer(){
    let counter = 0
    function inner(){
        counter++
        console.log("counter = " + counter)
    }
    inner()
}
outer()
outer() 
/* Output:
counter = 1
counter = 1 */

?帶閉包的範例

function outer(){
    let counter = 0
    function inner(){
        counter++
        console.log("counter = " + counter)
    }
    return inner
}
const fn = outer()
fn()
fn()
/* Output:
counter = 1
counter = 2 */

?閉包的主要特點

  1. 持久記憶體:外部函數作用域中的變數在外部函數退出後很長一段時間內都會被「記住」。
  2. 詞法作用域:閉包基於函數的定義位置,而不是函數的執行位置。
  3. 多個實例:每個閉包實例儲存自己的外部變數副本。

?多個實例的範例:

function counterFunction() {
    let count = 0;

    return function increment() {
        count++;
        return count;
    };
}

const counter1 = counterFunction();
const counter2 = counterFunction();

console.log("counter1 = " + counter1()); // Output: 1
console.log("counter1 = " + counter1()); // Output: 2
console.log("counter2 = " + counter2()); // Output: 1
console.log("counter1 = " + counter1()); // Output: 3
console.log("counter2 = " + counter2()); // Output: 2

這裡,counter1 和 counter2 都有自己獨立的計數變數。

?閉包的實際用途

1️⃣ 資料隱私: 閉包可以隱藏全域範圍內的變量,因此它們僅在特定函數中可用。
?例:

function secretInfo() {
    let secret = "I love JavaScript";
    return {
        getSecret: function() {
            return secret;
        },
        setSecret: function(newSecret) {
            secret = newSecret;
        }
    };
}

const secretObject = secretInfo();
console.log(secretObject.getSecret()); // Output: I love JavaScript
secretObject.setSecret("I love Python too!");
console.log(secretObject.getSecret()); // Output: I love Python too!
secretObject.setSecret("I love PHP too!");
console.log(secretObject.getSecret()); // Output: I love PHP too!
// Attempting to Access secret Directly will not work
console.log(secretObject.secret); // Output: undefined

✍️ 此程式碼如何顯示資料隱私:

  1. 全域作用域保護:變數secret不能直接從全域作用域或程式碼的任何其他部分存取。例如,如果您嘗試 console.log(secretObject.secret),它將傳回 undefined。
  2. 私有狀態維護:閉包的變數secret是私有的,只能使用getSecret和setSecret方法讀取或修改。
  3. 受控存取:程式透過定義函數 getSecret 和 setSecret 來確保對 Secret 變數的有限存取。

2️⃣ 函數工廠: 函數工廠 是一個產生並傳回新函數的函數。它使我們能夠根據輸入參數動態建立自訂功能。
?例:

function outer(){
    let counter = 0
    function inner(){
        counter++
        console.log("counter = " + counter)
    }
    inner()
}
outer()
outer() 
/* Output:
counter = 1
counter = 1 */

✍️ 此程式碼如何展示函數工廠:

  1. 計算函數的工作原理就像工廠,根據輸入(因子)產生專門的乘數函數(雙倍、三倍)。
  2. 每個功能都是唯一且獨立的,但共享相同的核心邏輯。

3️⃣ 事件監聽器: 閉包通常用於回調和事件監聽器中以維護狀態。
?例:

function outer(){
    let counter = 0
    function inner(){
        counter++
        console.log("counter = " + counter)
    }
    return inner
}
const fn = outer()
fn()
fn()
/* Output:
counter = 1
counter = 2 */

✍️ 此程式碼如何展示閉包如何在事件偵聽器中運作:

  1. setupListener 函數建立一個閉包並在其中定義 clickCount 變數。
  2. 事件監聽器函數是一個回調,即使在 setupListener 方法執行完畢後也可以存取 clickCount。
  3. 每次按一下 ID 為「myButton」的按鈕時,事件偵聽器的回呼都會遞增 clickCount 並記錄更新的值。

JavaScript Closures: A Beginner

?結論

閉包是 JavaScript 中的一個基本思想,它允許開發人員建立更模組化、高效和私有的程式碼。了解閉包使您能夠編寫動態函數、維護持久狀態並實現資料封裝。

作為初學者,花時間練習和嘗試閉包。它們一開始可能看起來很困難,但透過實踐範例和用法,您很快就會意識到它們在 JavaScript 程式設計中令人難以置信的力量和多功能性。

是否有任何現實生活中的類比或例子可以幫助您學習閉包?在下面的評論部分分享它們!
快樂編碼! ✨

以上是JavaScript 閉包:初學者指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。