闭包该怎么理解

有这么一段代码:

 let add = (function(){
    let counter = 0 
     return function(){
        counter++
      return counter
    }
})()

在浏览器控制台输入add,返回:

ƒ (){
        counter++
      return counter
    }

输入add(),返回1,再次输入add(),返回2,依次累加。
目前我对闭包的理解就是

函数包含着函数,其中内部的函数需要使用外部函数的变量。
因为内部函数使用外部函数的变量,因此就让外部的函数更“安全”了,作用域不会受影响。

上面的代码有几个疑惑的地方:

(function(){
    let counter = 0 
     return function(){
        counter++
      return counter
    }
})()
  1. 这个不是立即执行函数吗,应该是返回这个函数执行的值给到变量add,为什么控制台返回的add是一个函数
  2. 为什么counter没有始终初始化从0开始
阅读 1.6k
2 个回答

一言以蔽之,跨作用域访问变量,就是闭包。基本上所有编程语言中,都是这么个概念。在 JS 里,这个作用域通常就是不同的 function 的执行上下文。

第一个问题:没错啊,是这个函数执行的值给到变量 add 啊,这里立即执行函数执行后的值就是里面那个匿名函数啊。

第二个问题:为什么要“始终初始化从 0 开始”?你先说说你是怎么理解这段代码的执行顺序的。

1.因为你return的是一个函数,这个函数肯定要执行才会返回结果。add()才会返回数值,add返回的是下面这个

return function(){
      counter++
      return counter
}

2.function引用的是外部的变量counter,你只是执行了counter++,而没有执行上面初始化的代码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏