闭包该怎么理解
有这么一段代码:
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
}
})()
- 这个不是立即执行函数吗,应该是返回这个函数执行的值给到变量add,为什么控制台返回的add是一个函数
- 为什么counter没有始终初始化从0开始
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一言以蔽之,跨作用域访问变量,就是闭包。基本上所有编程语言中,都是这么个概念。在 JS 里,这个作用域通常就是不同的 function 的执行上下文。
第一个问题:没错啊,是这个函数执行的值给到变量
add
啊,这里立即执行函数执行后的值就是里面那个匿名函数啊。第二个问题:为什么要“始终初始化从 0 开始”?你先说说你是怎么理解这段代码的执行顺序的。
1.因为你return的是一个函数,这个函数肯定要执行才会返回结果。add()才会返回数值,add返回的是下面这个
2.function引用的是外部的变量counter,你只是执行了counter++,而没有执行上面初始化的代码。