Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript执行返回函数的函数_Javascript_Function_Scope - Fatal编程技术网

JavaScript执行返回函数的函数

JavaScript执行返回函数的函数,javascript,function,scope,Javascript,Function,Scope,我有以下两个计数器函数,它们在运行时返回不同的结果 在第一个代码段中,计数器函数被分配给变量letsCount,执行该函数似乎会更新计数器函数中的变量计数 但是,在第二个代码段中,直接执行函数不会更新count变量 请您解释一下为什么它们有不同的结果,以及当返回函数的函数被赋给一个变量时会发生什么 片段1 function counter() { var count = 0; return function() { console.log(count++);

我有以下两个计数器函数,它们在运行时返回不同的结果

在第一个代码段中,计数器函数被分配给变量letsCount,执行该函数似乎会更新计数器函数中的变量计数

但是,在第二个代码段中,直接执行函数不会更新count变量

请您解释一下为什么它们有不同的结果,以及当返回函数的函数被赋给一个变量时会发生什么

片段1

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