闭包该怎么理解

发布于 2022-09-30 23:06:07 字数 737 浏览 38 评论 0

有这么一段代码:

 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开始

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

゛清羽墨安 2022-10-07 23:06:07

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

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

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

倾城泪 2022-10-07 23:06:07

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

return function(){
      counter++
      return counter
}

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文