这对JavaScript函数有何不同?

这对JavaScript函数有何不同?,javascript,lexical-closures,Javascript,Lexical Closures,我很难辨别JavaScript闭包到底是如何工作的。请看一下这两个函数,并说明它们的不同之处,即它们在多次调用时会产生完全不同的结果: 职能1 var add=(函数(){ var计数器=0; 返回函数(){ 返回计数器+=1; } })(); console.log(add());//结果是1 console.log(add());//结果是2 console.log(add());//结果是3您无法访问该机柜外部机柜内定义的任何变量。这有助于避免冲突,例如多个函数使用相同的变量名 在案例1

我很难辨别JavaScript闭包到底是如何工作的。请看一下这两个函数,并说明它们的不同之处,即它们在多次调用时会产生完全不同的结果:

职能1
var add=(函数(){
var计数器=0;
返回函数(){
返回计数器+=1;
}
})();
console.log(add());//结果是1
console.log(add());//结果是2

console.log(add());//结果是3
您无法访问该机柜外部机柜内定义的任何变量。这有助于避免冲突,例如多个函数使用相同的变量名

在案例1中,您返回的函数在外部iLife上具有闭包。因此,返回的函数能够存储count的值,即使它已经返回(即闭包),因此每次调用
add()

你的案例2似乎不正确。您没有定义
plus
函数。即使您定义了它,您也会得到未定义的
,因为您没有从
add()

函数添加(){
var计数器=0;
函数加号(){
返回计数器+=1;
}
加();
}
console.log(add());//结果是1
console.log(add());//结果是1

console.log(add());//结果是1在第一个示例中,声明了计数器,调用
add
时调用的函数本质上是:

function (){
    return counter += 1;
}
这很重要,因为不是每次调用
add
时都重新声明
计数器

在第二个示例中,每次调用
add
时都会重新声明
计数器

这对JavaScript函数有何不同

在每个示例中,您都声明了两个函数,一个嵌套在另一个函数中

在第一个示例中,调用外部函数一次,返回内部函数并将其分配给
add
。这意味着调用
add
将只执行内部函数

在第二个示例中,
add
引用外部函数。因此,调用
add
将始终执行外部和内部函数


如果我们稍微重写第一个示例(它仍然产生相同的结果),您可能会更好地看到差异:


注意
add
如何只调用一次,这意味着
var counter=0
只执行一次,而
plus
是我们实际调用的函数。由于
plus
是在
add
中定义的,因此它可以访问
计数器

在第一个示例中,外部函数运行一次,将计数器变量设置为零。外部函数返回内部函数,并将其分配给变量
add
。调用
add()
时,内部函数在声明它的上下文中运行,因此它可以递增计数器变量


在第二个示例中,使用名称
add
声明外部函数。每次调用
add
时,都会运行此外部函数。这个外部函数每次都将计数器设置为零,然后运行内部的
plus
函数,该函数将计数器递增为1并返回它。

下面是第一个代码段中的具体情况

var add = (function() {
  var counter = 0;
  return function() {
    return counter += 1;
  }
})();
在上面的语句中,您为变量
add
分配了一个函数,该函数增加了
计数器

注意事项:

  • 您可以通过执行一个enclosure函数来获得此函数。(请注意存储模块函数返回的内容)

  • 您可以通过将
    ()
    放在存储模块的后面来执行存储模块功能

  • 现在变量
    add
    是一个只增加
    计数器的函数。在这里,环境被设置为进行闭包-因此内部函数始终记住
    计数器先前的值


    因此,每次通过
    add
    变量执行内部函数时,都会看到增加的数字。

    在第二个示例中,每次调用
    add()
    时,
    计数器的值设置为
    0
    第二个示例实际上无效。我猜你的意思是
    函数plus(){}
    ?@FelixKling,然后
    返回plus()以及…@Aditya–让OP在代码中进行这些更改..此编辑将更改代码的含义,这里的解释是正确的,这是一个疏忽,所以你是说函数1的计数器没有在每次调用时重新声明?这怎么可能?因为我在某处了解到,无论何时调用函数,都会创建一个新的执行上下文。两者之间的区别标记到底是什么two@pedroyanky:包含
    var计数器的函数=0只执行一次。内部函数(
    returnfunction(){…}
    )是“每次”调用
    add()
    时调用的函数。示例之间的区别在于第一个示例执行
    var add=(function(){…}())
    ,而第二个示例执行
    var add=function(){}。第一个执行外部函数一次,第二个“每次”执行外部函数。“因为我在某个地方了解到,每当调用函数时,都会创建一个新的执行上下文。”这就是为什么在第二种情况下,
    计数器
    会被重置的原因。谢谢。我现在理解的是计数器的值存储在变量add中。由于匿名函数存储在变量中,因此可以安全地说,每当调用该函数时,变量add都会收到计数器的更新版本吗?计数器不存储在变量中,而是存储在函数中。每当函数运行时,它仍然可以访问声明时它可以访问的所有内容,包括
    var add = (function() {
      var counter = 0;
      return function() {
        return counter += 1;
      }
    })();