Javascript 脚本中的自调用函数闭包

Javascript 脚本中的自调用函数闭包,javascript,Javascript,下面是一段代码,当单击按钮时,该代码使数字增加1: <script type="text/javascript"> var incrementClickCount = (function () { var clickCount = 0; return function () { return ++clickCount; } })(); </script> <input type=

下面是一段代码,当单击按钮时,该代码使数字增加1:

<script type="text/javascript">
    var incrementClickCount = (function () {
        var clickCount = 0;
        return function () {
            return ++clickCount;
        }
    })();
</script>
<input type="button" value="click me" onclick="alert(incrementClickCount());" />
无论我调用多少次
getNumber()
函数,我总是得到1,而不是1,2,3,4,5

当我们再次点击按钮时。我们实际上调用了一个新的内部匿名函数

没有

解析IIFE时,将从IIFE返回匿名函数。这就是为什么它们会被立即调用的函数表达式调用。第
}()行上的
()
)()
调用它(而不是调用返回函数的incrementClickCount())

每次单击按钮(包括第一次)时,您都会调用当时返回(并分配给
incrementClickCount
)的同一个函数


IIFE再也不会被调用,因此行
var clickCount=0不再执行。

您应该在函数外部创建变量clickCount,然后启用onClick函数修改其值。干杯。

首先
递增clickCount
函数调用IIFE返回内部函数,该函数操作
clickCount
变量并递增它。
所有后续调用将该内部函数。因此
clickCount
变量被赋值为
var clickCount=0仅一次。
考虑以下输出:

console.log(incrementClickCount);
// outputs the inner function definition    
return function () {
    return ++clickCount;
}

console.log(incrementClickCount());  // 1
console.log(incrementClickCount());  // 2
console.log(incrementClickCount());  // 3
下面是一个很好的例子:

每次单击按钮时,都会调用“incrementClickCount()”函数

但是当代码第一次实际运行时,变量'incrementClickCount'从自调用函数获取返回函数的值

所以简单地说,变量'incrementClickCount'在其内部包含内部函数,如下所示

incrementClickCount = function () {
            return ++clickCount;
        }
由于关闭,此方法可以使用clickCount值。所以它每次都递增,而不是重置值


由于自调用函数不会每次都被调用,因为每次调用函数时“clickCount”不会被重置为0

,因此您会将clickCount值重置为0,这就是为什么它总是显示1。
clickCount
是在(匿名、返回)函数之外定义的,这就是代码工作的原因。但是由于IIFE是第一次被调用,变量clickCount应该被销毁,不是吗?就像函数中的变量一样,一旦函数被调用,就无法再次访问函数中的变量?“变量clickCount应该被销毁-否。IIFE(匿名函数)的返回值分配给该变量。除了调用该函数外,对该变量没有任何操作。没有任何操作会破坏它。但是由于IIFE是第一次被调用,变量clickCount应该被破坏,不是吗?就像函数中的变量一样,一旦函数被调用,函数c中的变量就不可能被破坏可以再次访问吗?@slowjamsz11不可以,因为这部分代码只执行了一次,然后它就在内存中,因为变量是在全局范围内声明的,而不是在函数范围内。但是由于IIFE是第一次被调用,所以变量clickCount应该被销毁,不是吗?就像函数中的变量一样,一旦函数已调用,无法再次访问函数中的变量?@slowjamsz11,否,每个闭包都有自己的环境…共享环境是在匿名函数体中创建的,在定义后立即执行。在您的情况下,
clickCount
变量是“*共享环境”的一部分
incrementClickCount = function () {
            return ++clickCount;
        }