在javascript中关闭和匿名函数

时间:2017-09-09 16:51:36

标签: javascript closures anonymous-function

我试图理解闭包。你怎么解释这两种情况的行为。

情景1

<input type="button" value="Click me" onclick="alert(handle())"/>
<script>
var handle = (function(){
  var count = 0;
  return function(){
    return ++count ;
  }
})();
</script>

场景2

<input type="button" value="Click me" onclick="alert(handle()())"/>
<script>
var handle = function(){
  var count = 0;
  return function(){
    return ++count ;
  }
};
</script>

这两种情况不一样吗?为什么在第一个场景中外部函数只被调用一次,在第一次单击后,每次调用内部函数都被调用。

2 个答案:

答案 0 :(得分:1)

在第一种情况下,您创建返回函数的函数句柄,然后调用该函数,以便使用的句柄方法是句柄内部的闭包,它跟踪闭包scop(count)中的变量。第二种情况是每次都返回一个新的闭包,因为调用handle()会返回一个新的闭包。因此,您正在重置每个按钮单击的范围,因为您正在创建一个使用handle()调用的新闭包。

答案 1 :(得分:0)

在第一种情况下,你正在评估函数,所以你得到的是内部函数,它会在每次调用时递增计数器。

然而,在第二种情况下,handle包含外部函数,所以如果你调用它,你将获得内部函数,这反过来会在调用时递增计数器。

因此,当他们实际执行不同的事情时,两个片段都被称为handle