技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運營

贊助商

分類目錄

贊助商

最新文章

搜索

4個示例解釋何為JS閉包及何時使用閉包

作者:admin    時間:2022-6-6 17:37:53    瀏覽:

閉包是一個訪問其詞法范圍的函數(shù),甚至在其詞法范圍之外執(zhí)行。

更簡單地說,閉包是一個函數(shù),它從定義它的地方記住變量,而不管它后來在哪里執(zhí)行。在本文中,將通過多個示例介紹什么是閉包,及何時使用閉包。

JavaScript 閉包

在開始認(rèn)識閉包之前,你得首先了解嵌套函數(shù)。

在 JavaScript 中,一個函數(shù)可以有一個或多個內(nèi)部函數(shù)。這些嵌套函數(shù)在外部函數(shù)的范圍內(nèi)。內(nèi)部函數(shù)可以訪問外部函數(shù)的變量和參數(shù)。但是,外部函數(shù)不能訪問內(nèi)部函數(shù)內(nèi)部定義的變量。

示例:嵌套函數(shù)

function OuterFunction() {

    var outerVariable = 1;

    function InnerFunction() {
        alert(outerVariable);
    }

    InnerFunction();
}

在上面的例子中,InnerFunction() 可以訪問 outerVariable 這個變量。

閉包的定義

現(xiàn)在,根據(jù)上面的定義,InnerFunction() 可以訪問 outerVariable 變量,即使它會單獨執(zhí)行。參看以下示例。

function OuterFunction() {

    var outerVariable = 100;

    function InnerFunction() {
        alert(outerVariable);
    }

    return InnerFunction;
}
var innerFunc = OuterFunction();

innerFunc(); // 100

demodownload

在上面的示例中,return InnerFunction; 當(dāng)你調(diào)用 OuterFunction() 時,從 OuterFunction 返回 InnerFunction。變量innerFunc 僅引用 InnerFunction(),而不引用 OuterFunction()。所以現(xiàn)在,當(dāng)你調(diào)用 innerFunc() 時,它仍然可以訪問outerVariableOuterFunction() 中聲明的內(nèi)容,這稱為閉包。

閉包:內(nèi)部函數(shù)會更改外部變量的值

一個函數(shù)可以在 JavaScript 中返回另一個函數(shù),分配給變量的函數(shù)稱為函數(shù)表達式。

閉包的一個重要特征是外部變量可以在多次調(diào)用之間保持其狀態(tài)。請記住,內(nèi)部函數(shù)不會保留外部變量的單獨副本,而是引用外部變量,這意味著外部變量的值將會改變,如果你使用內(nèi)部函數(shù)更改它。示例:

function Counter() {
    var counter = 0;

    function IncreaseCounter() {
        return counter += 1;
    };

    return IncreaseCounter;
}

var counter = Counter();
alert(counter()); // 1
alert(counter()); // 2
alert(counter()); // 3
alert(counter()); // 4

demodownload

在上面的例子中,外部函數(shù)Counter返回內(nèi)部函數(shù)IncreaseCounter()的引用。increaseCounter 將外部變量 counter 增加到 1。所以多次調(diào)用內(nèi)部函數(shù)會使計數(shù)器每次增加一個。

閉包:在多層內(nèi)部函數(shù)中有效

閉包在多層內(nèi)部函數(shù)中是有效的。示例:

function Counter() {
    
    var counter = 0;

    setTimeout( function () {
        var innerCounter = 0;
        counter += 1;
        alert("counter = " + counter);

        setTimeout( function () {
            counter += 1;
            innerCounter += 1;
            alert("counter = " + counter + ", innerCounter = " + innerCounter)
        }, 500);

    }, 1000);
};

Counter();

demodownload

根據(jù)閉包的定義,如果內(nèi)部函數(shù)訪問外部函數(shù)的變量,那么只有它被稱為閉包。

不是閉包的示例:

var Counter = (function () {
        var i = 0;
        return { counter : i += 1 };
})();

何時使用閉包?

閉包對于隱藏 JavaScript 中的實現(xiàn)細(xì)節(jié)很有用。換句話說,創(chuàng)建私有變量或函數(shù)可能很有用。

以下示例顯示了如何創(chuàng)建私有函數(shù)和變量:

var counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  };   
})();

alert(counter.value()); // 0
counter.increment();
counter.increment();
alert(counter.value()); // 2
counter.decrement();
alert(counter.value()); // 1

demodownload

在上面的示例中,increment()、decrement()value() 成為公共函數(shù),因為它們包含在返回對象中,而 changeBy() 函數(shù)成為私有函數(shù),因為它不返回并且僅在內(nèi)部使用increment()decrement()。

總結(jié)

本文通過多個示例,介紹了什么是閉包,以及何時使用閉包。通過本文的學(xué)習(xí),你應(yīng)該記住了閉包的一些重要特性,懂得判斷一些函數(shù)是不是閉包,不具備閉包特性的函數(shù)就不能稱之為閉包。

相關(guān)文章

標(biāo)簽: 閉包  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */