搜尋
首頁web前端js教程JavaScript 閉包的魔力:清晰易懂的指南

JavaScript 中的閉包是什麼?

將閉合想像成您下課後隨身攜帶的背包。背包裡有你在課堂上學到的所有筆記和材料。即使課程結束後,您仍然可以在需要時使用背包中的所有物品。類似地,閉包允許函數保留對其外部作用域的變數和參數的訪問,即使在外部函數完成運行並且這些變數在該函數外部不再可訪問之後也是如此。

上面的解釋是描述閉包的典型方式,但是對於剛接觸 JavaScript 的人來說它適合初學者嗎?並不真地。當我第一次遇到它時,我也覺得很困惑。這就是為什麼我寫這篇文章是為了讓閉包盡可能簡單,讓任何人都能理解。我們將先介紹基礎知識,然後再深入探討這個主題。

理解 JavaScript 中的作用域

要理解什麼是閉包,我們必須簡單了解 JavaScript 中的作用域。範圍是指程式碼不同部分中變數和函數的可訪問性。它決定了我們可以在程式中存取某些變數或函數的位置。

作用域有兩種主要類型:全域作用域和局部作用域。在全域作用域中聲明的變數存在於任何函數或區塊之外,從而使它們可以在整個程式碼中存取。相反,在局部範圍內(例如在函數或區塊內)聲明的變數只能在該特定函數或區塊內存取。下面的程式碼說明了這個解釋。

// GLOBAL SCOPE
let myName = "John Doe";

function globalScope() {
  console.log(myName);
}
globalScope(); //Output John Doe
console.log(myName); // Accessible here as well

// LOCAL SCOPE
function localScope() {
  let age = 30;
  console.log(age);
}
localScope(); //Output 30
console.log(age); //Output age is not defined (Not Accessible)

然而,JavaScript 使用了一個稱為詞法作用域的概念,這對於理解閉包的工作原理至關重要。詞法作用域意味著變數的可訪問性由編寫程式碼時的結構決定。簡單來說,這就像在說:「如果在函數內聲明變量,則只有該函數及其中的任何內容都可以訪問該變量。」{https://javascript.info/closure}。

詞法範圍和執行上下文

為了更清楚地理解這一點,讓我們看看 JavaScript 在幕後是如何運作的。 JavaScript 使用稱為執行上下文的東西,它就像一個保存正在運行的程式碼的容器。它追蹤變數、函數以及目前正在運行的程式碼部分。當腳本啟動時,將建立全域執行上下文 (GEC)。需要注意的是,程式中只有一個全域執行上下文。

The Magic of JavaScript Closures: A Clear and Easy Guide
上圖代表了程式開始時的全域執行上下文。它由兩個階段組成:創建(或記憶體)階段和執行(或程式碼)階段。在創建階段,變數和函數儲存在記憶體中——變數被初始化為未定義,函數被完全儲存。在執行階段,JavaScript 逐行執行程式碼,為變數賦值並執行函數。

現在我們了解了 JavaScript 如何處理執行上下文和詞法作用域,我們可以看到它如何直接與閉包連結。

閉包如何運作:一個例子

當內部函數保留對其外部函數作用域中的變數的存取權時,即使外部函數已完成執行,也會建立 JavaScript 中的閉包。這是可能的,因為內部函數保留了定義它的詞法環境,允許它「記住」並使用外部作用域中的變數。

// GLOBAL SCOPE
let myName = "John Doe";

function globalScope() {
  console.log(myName);
}
globalScope(); //Output John Doe
console.log(myName); // Accessible here as well

// LOCAL SCOPE
function localScope() {
  let age = 30;
  console.log(age);
}
localScope(); //Output 30
console.log(age); //Output age is not defined (Not Accessible)

這是有關上述程式碼如何運作的指南。每當我們呼叫函數時,JavaScript 引擎都會建立一個特定於該函數的函數執行上下文 (FEC),該函數執行上下文是在全域執行上下文 (GEC) 內建立的。與 GEC 不同,一個程式中可以有多個 FEC。每個 FEC 都會經歷自己的創建和執行階段,並擁有自己的變數和詞法環境。詞法環境使函數能夠從其外部作用域存取變數。

當outerFunction被呼叫時,會建立一個新的FEC,在outerFunction內部,我們定義innerFunction,由於詞法作用域,它可以存取outerVariable。在outerFunction返回後,outerFunction的執行上下文將從呼叫堆疊中刪除,但innerFunction由於閉包而保留對outerVariable的存取。因此,當我們稍後呼叫closureExample()時,即使outerFunction已經完成,它仍然可以記錄outerVariable。

閉包的實際應用

讓我們來看看以下範例:

Let’s look at the example below:

function outerFunction() {
    let outerVariable = 'I am John Doe';

    return function innerFunction() {
        console.log(outerVariable);
    };
}

const closureExample = outerFunction();
closureExample();  // Outputs: "I am John Doe"

你認為這段程式碼的輸出會是什麼?你們中的許多人可能猜到了 5,但這真的是正確的輸出嗎?事實上,不,原因如下。函數 y() 引用變數 a,而不是其初始值。當 z() 被呼叫時,由於返回內部函數之前進行了更新,它會記錄 a 的當前值,即 50。讓我們探討另一個例子:

function x(){
      let a = 5
     function y(){
         console.log(a)
      }
      a = 50
      return y;
    }
    let z = x();
    console.log(z)
    z();

程式碼展示了閉包的威力。即使在最裡面的函數 z() 中,它仍然可以從其父作用域存取變數。如果我們檢查瀏覽器並檢查 Sources 選項卡,我們可以看到 x 和 y 上都形成了閉包,這允許 z() 從其父上下文存取 a 和 b。

The Magic of JavaScript Closures: A Clear and Easy Guide

使用閉包的優點

閉包在 JavaScript 中提供了多種優勢,特別是在編寫更靈活、模組化和可維護的程式碼時。以下是一些主要優點:

1。回呼函數: 閉包在處理非同步程式設計時非常強大,例如回呼、事件監聽器和 Promise。即使在外部函數完成後,它們也允許回調函數保持對外部函數變數的存取。

// GLOBAL SCOPE
let myName = "John Doe";

function globalScope() {
  console.log(myName);
}
globalScope(); //Output John Doe
console.log(myName); // Accessible here as well

// LOCAL SCOPE
function localScope() {
  let age = 30;
  console.log(age);
}
localScope(); //Output 30
console.log(age); //Output age is not defined (Not Accessible)

2。模組化和可維護性: 閉包允許開發人員編寫更小、可重複使用的程式碼區塊,從而鼓勵模組化。由於閉包可以在函數呼叫之間保留變量,因此減少了對重複邏輯的需求並提高了可維護性。

3。避免全域變數: 閉包有助於減少對全域變數的需求,從而避免潛在的命名衝突並保持全域命名空間乾淨。透過使用閉包,您可以將資料儲存在函數範圍內而不是全域。

結論

閉包是 JavaScript 中一個強大的概念,它允許函數記住和存取其外部作用域中的變量,甚至在函數執行之後也是如此,從而擴展了函數的功能。此功能在創建更模組化、靈活且高效的程式碼方面發揮著重要作用,特別是在處理非同步任務、回調和事件偵聽器時。雖然閉包一開始看起來很複雜,但掌握它們將使您能夠編寫更複雜和優化的 JavaScript。當您繼續練習時,您將發現閉包如何幫助編寫更乾淨、更易於維護的應用程式。不斷嘗試,很快閉包將成為你的 JavaScript 工具箱的自然組成部分。

以上是JavaScript 閉包的魔力:清晰易懂的指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在JavaScript中替換字符串字符在JavaScript中替換字符串字符Mar 11, 2025 am 12:07 AM

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

自定義Google搜索API設置教程自定義Google搜索API設置教程Mar 04, 2025 am 01:06 AM

本教程向您展示瞭如何將自定義的Google搜索API集成到您的博客或網站中,提供了比標準WordPress主題搜索功能更精緻的搜索體驗。 令人驚訝的是簡單!您將能夠將搜索限制為Y

示例顏色json文件示例顏色json文件Mar 03, 2025 am 12:35 AM

本文系列在2017年中期進行了最新信息和新示例。 在此JSON示例中,我們將研究如何使用JSON格式將簡單值存儲在文件中。 使用鍵值對符號,我們可以存儲任何類型的

構建您自己的Ajax Web應用程序構建您自己的Ajax Web應用程序Mar 09, 2025 am 12:11 AM

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

8令人驚嘆的jQuery頁面佈局插件8令人驚嘆的jQuery頁面佈局插件Mar 06, 2025 am 12:48 AM

利用輕鬆的網頁佈局:8 ESTISSEL插件jQuery大大簡化了網頁佈局。 本文重點介紹了簡化該過程的八個功能強大的JQuery插件,對於手動網站創建特別有用

什麼是這個'在JavaScript?什麼是這個'在JavaScript?Mar 04, 2025 am 01:15 AM

核心要點 JavaScript 中的 this 通常指代“擁有”該方法的對象,但具體取決於函數的調用方式。 沒有當前對象時,this 指代全局對象。在 Web 瀏覽器中,它由 window 表示。 調用函數時,this 保持全局對象;但調用對象構造函數或其任何方法時,this 指代對象的實例。 可以使用 call()、apply() 和 bind() 等方法更改 this 的上下文。這些方法使用給定的 this 值和參數調用函數。 JavaScript 是一門優秀的編程語言。幾年前,這句話可

通過來源查看器提高您的jQuery知識通過來源查看器提高您的jQuery知識Mar 05, 2025 am 12:54 AM

jQuery是一個很棒的JavaScript框架。但是,與任何圖書館一樣,有時有必要在引擎蓋下發現發生了什麼。也許是因為您正在追踪一個錯誤,或者只是對jQuery如何實現特定UI感到好奇

10張移動秘籍用於移動開發10張移動秘籍用於移動開發Mar 05, 2025 am 12:43 AM

該帖子編寫了有用的作弊表,參考指南,快速食譜以及用於Android,BlackBerry和iPhone應用程序開發的代碼片段。 沒有開發人員應該沒有他們! 觸摸手勢參考指南(PDF)是Desig的寶貴資源

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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)