有这么一段代码:
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开始
一言以蔽之,跨作用域访问变量,就是闭包。基本上所有编程语言中,都是这么个概念。在 JS 里,这个作用域通常就是不同的 function 的执行上下文。
第一个问题:没错啊,是这个函数执行的值给到变量
add
啊,这里立即执行函数执行后的值就是里面那个匿名函数啊。第二个问题:为什么要“始终初始化从 0 开始”?你先说说你是怎么理解这段代码的执行顺序的。