JavaScript閉包原理是啥

小樊
81
2024-10-31 08:04:50
欄目: 編程語言

JavaScript閉包(Closure)是一種在函數(shù)內(nèi)部創(chuàng)建并返回另一個(gè)函數(shù)的技術(shù)。閉包允許一個(gè)函數(shù)訪問其外部作用域中的變量,即使外部函數(shù)已經(jīng)返回。閉包的原理主要基于JavaScript的作用域鏈(Scope Chain)和詞法環(huán)境(Lexical Environment)。

以下是閉包原理的簡(jiǎn)要說明:

  1. 當(dāng)一個(gè)函數(shù)被創(chuàng)建時(shí),它會(huì)攜帶一個(gè)指向其外部作用域的詞法環(huán)境。詞法環(huán)境包含了函數(shù)定義時(shí)所在的作用域中的變量和函數(shù)。

  2. 當(dāng)一個(gè)內(nèi)部函數(shù)引用了外部函數(shù)的變量時(shí),JavaScript引擎會(huì)通過詞法環(huán)境鏈找到這個(gè)變量。

  3. 即使外部函數(shù)已經(jīng)返回,閉包仍然可以訪問這些變量,因?yàn)閮?nèi)部函數(shù)保留了對(duì)詞法環(huán)境的引用。

下面是一個(gè)簡(jiǎn)單的閉包示例:

function outer() {
  let count = 0;

  function inner() {
    count++;
    console.log(count);
  }

  return inner;
}

const incrementCounter = outer();
incrementCounter(); // 輸出 1
incrementCounter(); // 輸出 2

在這個(gè)例子中,outer 函數(shù)返回了 inner 函數(shù),形成一個(gè)閉包。當(dāng)我們調(diào)用 incrementCounter 時(shí),它實(shí)際上是在調(diào)用 inner 函數(shù)。盡管 outer 函數(shù)已經(jīng)返回,但由于閉包保留了對(duì)外部作用域(包含變量 count)的引用,所以 inner 函數(shù)仍然可以訪問和修改 count 變量。

0