繁体   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