在JavaScript中自调用函数闭包

时间:2017-01-10 07:40:11

标签: javascript

这是一段代码,当单击按钮时,数字会增加1:

dynamic emotion = new { smile = 1, angry = 2, worry = 3 };
Console.WriteLine(emotion.smile);

我不知道的是,我认为每次单击按钮时我们都应该获得值“1”,所以序列将是

步骤1:自我调用外部函数调用self,内部匿名函数的定义存储在增量<script type="text/javascript"> var incrementClickCount = (function () { var clickCount = 0; return function () { return ++clickCount; } })(); </script> <input type="button" value="click me" onclick="alert(incrementClickCount());" /> 变量中。

第2步:单击按钮时,调用内部匿名函数将incrementClickCount的值从0更改为1,因此我们得到1作为输入,足够公平。

第3步:当我们再次点击按钮时,这里是我不理解的棘手部分。我们实际上调用了一个新的内部匿名函数,所以输入应该再次为1,为什么现在为2?就像这个普通的java或C#函数一样:

clickCount

无论我多少次调用public int getNumber() { int clickCount = 0; return addNumber(clickCount); } public int addNumber(int number) { return number++; } 函数,我总是得到1而不是1,2,3,4,5 ....

4 个答案:

答案 0 :(得分:3)

  

当我们再次点击该按钮时。我们实际上称之为一个新的内部匿名函数

没有

解析IIFE时,从IIFE返回匿名函数。这就是他们被称为立即调用函数表达式的原因。行()上的})();调用它(不是调用返回函数的incrementClickCount())。

每次时,您点击该按钮(包括第一次),就可以调用已返回(并分配给incrementClickCount)的相同功能时间。

IIFE永远不会被再次调用,因此行var clickCount = 0;永远不会再被执行。

答案 1 :(得分:1)

incrementClickCount函数调用时,IIFE返回内部函数,该函数操作clickCount变量并递增它。
所有进一步调用将 ON 该内部函数。因此,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

这是一个很好的例子:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Emulating_private_methods_with_closures

答案 2 :(得分:1)

每次点击你正在调用的按钮&#34; incrementClickCount()&#34;功能

但是当代码第一次实际运行时,变量&quot; incrementClickCount&#39;从自调用函数中获取返回函数的值。

如此简单的变量&#39; incrementClickCount&#39;在其中保存内部函数,如下所示。

incrementClickCount = function () {
            return ++clickCount;
        }
由于关闭,

和clickCount值可用于此方法。所以它每次递增它,而不是重置值。

因为每次都没有调用自调用函数,因为“clickCount”#39;没有重置为0

答案 3 :(得分:-1)

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