这是一段代码,当单击按钮时,数字会增加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 ....
答案 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
答案 2 :(得分:1)
每次点击你正在调用的按钮&#34; incrementClickCount()&#34;功能
但是当代码第一次实际运行时,变量&quot; incrementClickCount&#39;从自调用函数中获取返回函数的值。
如此简单的变量&#39; incrementClickCount&#39;在其中保存内部函数,如下所示。
incrementClickCount = function () {
return ++clickCount;
}
由于关闭,和clickCount值可用于此方法。所以它每次递增它,而不是重置值。
因为每次都没有调用自调用函数,因为“clickCount”#39;没有重置为0
答案 3 :(得分:-1)
您应该在函数外部创建变量clickCount,然后启用onClick函数来修改其值。欢呼声。