闭包概念
广义:函数内部使用了外部的变量
狭义:内部函数使用了外部函数的局部变量
没有闭包这个概念之前我们不知道闭包是什么东西,看着觉得很难,理解了概念后,会发现闭包是再常见不过的一个问题,并且我们就经常使用,所以看下去之前建议再读一遍闭包的概念,理解闭包的概念。
function outer(){
let index = 0
return function(){
index++
}
}
// res保存的是一个function
let res = outer()
// 这个的res()又执行了这个res的方法
console.log(res())
在这一段代码中,index是函数的变量(也是局部变量),outer()执行返回一个function(){index++},并且赋值给res,这时的res保存的是一个函数,res函数里面的index用到了外面的变量index,所以这是一个闭包。
总结:局部变量是安全的,外部不可修改,所以使用闭包的作用也是保证数据的安全
如果面试官问我们
闭包是什么?
答:闭包是内部函数使用了外部函数的局部变量,他的作用主要是保证数据的安全,把全局变量变成局部变量(自执行函数也可以把全局变量变成局部变量,但是自执行函数不可操作,局限性大)。
闭包有没有什么缺点?
答:闭包通常是外部变量保存内部函数,导致内部函数不会被释放,内部函数又占用了外部函数的变量,导致外部函数的变量也无法释放,因此会占用内存。
这种缺点有没有办法解决?
答:可以解决,如果闭包函数不需要再次使用,可以给保存内部函数的变量重新赋值,释放掉内部函数的占用,从而释放所有资源。
用上面的代码做例子解释缺点和解决方法
外部变量res保存内部函数function(){index++},导致内部函数不会被释放,内部函数又占用了外部函数function outer(){}的index变量,导致这个外部函数也无法释放,因此占用内存。
解决方法就是给保存内部函数的外部变量重新赋值,释放掉内部函数的占用
res = null
这样就可以释放所有资源了。