2017-09-09 21 views
2

我想理解闭包。你将如何解释这两种情况的行为。在javascript中关闭和匿名函数

方案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

[JavaScript中的(function(){})()构造是什么?](https://stackoverflow.com/questions/8228281/what-is-the-function-construct-in-javascript) – adeneo

回答

0

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

然而,在第二种情况下,handle包含外部函数,所以如果您调用该函数,您将获得内部函数,这会在调用时增加计数器。

所以这两个片段被称为handle,当他们实际上做不同的事情。

+0

in第一种情况,每次我点击按钮,计数值增加1. – VivekT

+0

你是对的@VivekT我的解释是不正确的。我编辑了答案,现在我认为它反映了现实 –

1

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