Javascript 闭包和变量定义

Javascript 闭包和变量定义,javascript,Javascript,我正在研究一个关于CodeSchool的具体例子,这个例子应该是闭包的例子。我很难理解一个简单的概念。有人能给我指出正确的方向吗 function warningMaker( obstacle ){ var count=0; return function ( number, location ) { count++; alert("Beware! There have been " + obstacle + " sightings in the Cove today!\

我正在研究一个关于CodeSchool的具体例子,这个例子应该是闭包的例子。我很难理解一个简单的概念。有人能给我指出正确的方向吗

function warningMaker( obstacle ){
var count=0;
return function ( number, location ) {
count++;
alert("Beware! There have been " +
      obstacle +
      " sightings in the Cove today!\n" +
      number +
      " " +
      obstacle +
      "(s) spotted at the " +
      location +
      "!\n" + "This is Alert #" + count+" today for"  +obstacle+ " danger."
     );
};
}
在这个函数中,如果我定义var penguin=warningMaker('penguin')。 然后我把企鹅(1,波士顿)作为一个例子。计数将返回为1。每次调用此函数时,计数都会增加


我很难理解这是怎么发生的!?不是每次调用函数时都会调用“var count=0”吗?这不会重置count变量的值吗

只调用一次warningMaker来创建企鹅对象。调用warningMaker时,将在其范围内创建变量count,并返回分配给penguin的函数。因为返回的函数是在warningMaker中定义的,所以它可以访问其范围,从而访问变量“count”

闭包是在JavaScript中创建私有变量/方法功能的常用技术

了解闭包的好资源可以在这里找到:


最好。

在您的示例中,闭包的工作方式基本上是创建一个count变量并将其保存在内存中。然后,warningMaker函数返回另一个函数。它返回的函数是每次使用参数调用warningMaker()时执行的函数

每次调用
warningMaker()
时都会调用它(在本例中为一次),但初始化在
penguin()
函数之外,因此它永远不会重置。
penguin
包含由
warningMaker
返回的值,这是一个函数。该函数不包含
var count=0。可能存在的重复项