几个重要的点
闭包是JS的一种语法特性
或者说 JS的所有函数都支持闭包
闭包 = 函数 + 自由变量(他在声明时,可以访问他父级作用域的变量 ->保存在堆内存中,同时堆中还保留了对父级作用域的引用)
当使用一个变量时,会尝试在当前作用域下寻找该变量;向上寻找(不会向下)【也就是产生了作用域链】
举个简单的例子
错误的例子
var count = 0
function add(){
count += 1 //访问外部变量就一定是闭包了吗?
}
**注意:**上边说了 自由变量 。你这个 var count = 0
是生命在了全局啊!你必须放在非全局环境下
怎么改?
{
let count = 0 //既不是全局、又不是add()的局部变量,就形成了闭包
function add(){
count += 1
}
}
当然可以使用立即执行函数来创造【非全局环境】
const add2 = function (){
var count
return function add (){ // 访问了外部变量的函数
count += 1
}
}()
能解决什么问题
缺点
开发中很常见的例子
- 节流
- 防抖
- 函数柯里化
- ......