最后一段javascript关闭我不明白

时间:2015-11-20 22:09:08

标签: javascript

假设我们已在全球范围内定义了此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

所以我的问题是,为什么会这样:

counter1

最后让功能起作用?

基本上不是createCountercounter1()指向全局范围内的内部函数的指针吗?

也许更好的方式来问这个问题是为什么createCounter能够工作而不仅仅像$str = '[flexvideo id="" type=\'biuahsdiuasd\' aspect="c"]\iU'; $reg = '/\[flexvideo\s+id=["\'](?<id>[^"\']*)["\']\s+type=["\'](?<type>[^"\']*).*?\]/'; preg_match($reg, $str, $match); print_r($match); 那样返回内部函数?

4 个答案:

答案 0 :(得分:3)

不,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

答案 1 :(得分: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()并将结果保存在变量中时,您将获得“在createCounter中”的输出,但不是“事件数”。当您调用存储在变量中的函数时,您会得到“事件数:1”但不是“在createCounter中”。

答案 2 :(得分:1)

  1. 在JS函数中objects类型为Function
  2. createCounter在全球范围内,但increment不是。
  3. 当你调用createCounter()时,它会返回一个存在于该范围内的&#39; createCounter function scope and there is another variable counter`中的函数。

  4. 因此,当您调用返回的函数时,您将counter1命名为counter1(),然后调用它,然后递增计数器并记录结果。

答案 3 :(得分:1)

如果你执行console.log(counter1),它将打印该函数,因为它只是函数指针。

什么时候counter1(),你正在调用函数本身