假设我们已在全球范围内定义了此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
最后让功能起作用?
基本上不是createCounter
和counter1()
指向全局范围内的内部函数的指针吗?
也许更好的方式来问这个问题是为什么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);
那样返回内部函数?
答案 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)
objects
类型为Function
。 createCounter
在全球范围内,但increment
不是。当你调用createCounter()时,它会返回一个存在于该范围内的&#39; createCounter function scope and there is another variable
counter`中的函数。
因此,当您调用返回的函数时,您将counter1
命名为counter1()
,然后调用它,然后递增计数器并记录结果。
答案 3 :(得分:1)
如果你执行console.log(counter1)
,它将打印该函数,因为它只是函数指针。
什么时候counter1()
,你正在调用函数本身