JavaScript执行返回函数的函数
我有以下两个计数器函数,它们在运行时返回不同的结果 在第一个代码段中,计数器函数被分配给变量letsCount,执行该函数似乎会更新计数器函数中的变量计数 但是,在第二个代码段中,直接执行函数不会更新count变量 请您解释一下为什么它们有不同的结果,以及当返回函数的函数被赋给一个变量时会发生什么 片段1JavaScript执行返回函数的函数,javascript,function,scope,Javascript,Function,Scope,我有以下两个计数器函数,它们在运行时返回不同的结果 在第一个代码段中,计数器函数被分配给变量letsCount,执行该函数似乎会更新计数器函数中的变量计数 但是,在第二个代码段中,直接执行函数不会更新count变量 请您解释一下为什么它们有不同的结果,以及当返回函数的函数被赋给一个变量时会发生什么 片段1 function counter() { var count = 0; return function() { console.log(count++);
function counter() {
var count = 0;
return function() {
console.log(count++);
}
}
var letsCount = counter();
letsCount(); // 0
letsCount(); // 1
letsCount(); // 2
片段2
function counter() {
var count = 0;
return function() {
console.log(count++);
}
}
counter()(); // 0
counter()(); // 0
counter()(); // 0
每次调用
counter()
时,都会创建一个新的匿名函数实例,该实例具有自己的作用域变量。如果要继续使用相同的功能,必须执行以下操作:
var counter = (function () {
var count = 0;
var fn = function() {
console.log(count++);
};
return function () {
return fn;
};
})();
counter()(); // 0
counter()(); // 1
counter()(); // 2
将创建一个匿名函数,然后将其存储在一个有作用域的
fn
函数中,然后我们返回一个函数,该函数在调用时将返回fn
保存的值。在第一种情况下,您使用函数指针引用它。。
这样就保存了上下文
而在第二种情况下,调用函数时,计数为0。
因此,这里的变量与上下文无关,因此您可以看到值为0,代码段1和代码段2的调用不同。您的第一个代码段引用了一个返回的函数,该函数保留其作用域(是一个闭包,引用了count
)
您的第二个代码段每次都调用外部函数,总是返回一个对新函数的引用,并将新的闭包添加到一个新的计数。事实上,您获得这种行为的原因非常合理。调用
counter()()
时,将执行第一个counter()
调用,有效地将变量count
重置为0。将变量设置为计数器()
时,实际上是将其设置为返回的函数:
var letsCount = // (function() {
// var count = 0;
return function() {
console.log(count++);
}
// })();
然后,当您调用
letscont
时,您调用的是返回的函数,而不是外部函数。无论何时调用counter
,您都会创建一个新函数并将count
设置为0
。