簡體   English   中英

最后一段javascript閉包我不明白

[英]Final piece of javascript closures I stil don't understand

假設我們已在全局范圍內定義了此function

function createCounter() {
  var counter = 0;

  function increment() {
    counter = counter + 1;

    console.log("Number of events: " + counter);
  }

  return increment;
}

在解釋閉包的大多數示例中,我看到執行:

createCounter();

從全局范圍將只返回內部函數:

function increment() {
    counter = counter + 1;

    console.log("Number of events: " + counter);
}

現在這完全有道理,因為createCounter函數聲明中的這一行

return increment;

所以我的問題是,為什么這樣:

var counter1 = createCounter();

counter1();

Number of events: 1 //result

最后得到的功能是什么?

本質上不是counter1createCounter指向存在於全局范圍內的內部函數的指針?

也許更好的方式來問這是為什么counter1()工作而不僅僅像createCounter那樣返回內部函數呢?

不, createCounter是一個返回increment函數的單獨實例的函數,該實例持有一個具有不同本地counter變量的新閉包。

所以,是的,您需要額外的調用來獲取函數的單獨實例並根據需要多次調用。 請注意,調用createCounter不會增加計數器,但調用counter1或counter2會增加它。

var counter1 = createCounter(); //local counter is still 0
var counter2 = createCounter();
counter1(); // 1
counter2(); // 1
counter1(); // 2
counter2(); // 2

createCounter()返回函數而不調用它。

您可以執行createCounter()()來調用它,而無需中間變量。

如果你在外部函數中也有控制台輸出,就像這樣,它會更清楚發生了什么:

function createCounter() {
    console.log("in createCounter");

    var counter = 0;

    function increment() {
        counter = counter + 1;

        console.log("Number of events: " + counter);
    }

    return increment;
}

當您調用createCounter()並將結果保存在變量中時,您將獲得輸出“in createCounter”但不是“事件數”。 當您調用存儲在變量中的函數時,您會得到“事件數:1”但不是“在createCounter中”。

  1. 在JS函數中是Function類型的objects
  2. createCounter在全局范圍內,但increment不在。
  3. 當你調用createCounter()時,它返回一個存在於'createCounter function scope and there is another variable的函數,並且該function scope and there is another variable counter`。

  4. 因此,當您調用返回的函數時,您將counter1命名為counter1 counter1() ,然后調用它,然后遞增計數器並記錄結果。

如果你做console.log(counter1)它將打印該函數,因為它只是函數指針。

當執行counter1() ,您正在調用函數本身

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM