闭包在前端领域内算是老生常谈的一个话题了,基于我去解读zustand源码,我特定将闭包这个重新进行学习整理,已做到知其所以,知其所以然;
1、闭包概念
闭包可以这样说:当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行;总结为一下两点
- 1、函数可以记住当前所在的词法作用域;
- 2、函数脱离当前词法作用域,也可以记住之前的词法作用域;
下面我们判断一个例子:
function foo(){
var a = 12
function bar(){
console.log(a)
}
bar()
}
foo()
我们判断一下他是否形成闭包了呢?答案是没有,这块只不过是一个正常的的foo函数调用,bar函数通过作用域查找方式进行了执行,严格的说并不算闭包,只是有一个闭包的雏形;
我们在看看下面一段代码:
function foo(){
var a = 12
function bar(){
console.log(a)
}
return bar
}
const fn1 = foo()
fn1() // 2
当foo被执行后,理论上,foo在后续的代码找中没有引用,垃圾回收机制就会自动回收,然而bar中引用了foo函数作用的变量,导致无法进行垃圾回收,当然我们执行fn1就会再次访问到bar的作用域,因此我们可以通过console.log(a)可以拿到foo值;