引言
在面试中经常会被问到闭包,但是我对闭包其实还是感觉很陌生,那么什么是闭包呢?其实我们日常开发中经常用到闭包,只是我们没有意识到我们我们正在使用闭包,即便我们不知道闭包这个概念,我们也照样能使用闭包。
什么是闭包?
闭包是JS里的一种语法特性。
var count = 1
function add() {
count += 1
}
将上面代码放在非全局环境 里,它就是一个闭包了,闭包其实就是函数+自由变量(对于一个函数来说,变量分为:全局变量、本地变量、自由变量 )。那么,如何制造一个非全局环境呢?答案就是立即执行函数。
// 这里就是一个闭包
const fn = function () {
var count = 1 // 自由变量
function add() { // 函数
count += 1
}
}()
看到这里,有人会疑惑了,我听说闭包是函数套函数,然后return一个函数的。其实return函数是为了方便调用,不然函数内的函数也就没什么用了。
const fn = function () {
var count = 1
return function add() {
count += 1
}
}()
闭包的作用
- 提供对局部变量的间接访问(只能通过返回的函数去操作局部变量);
- 避免污染全局环境(因为用的是局部变量);
- 维持变量,使其不被垃圾回收。
闭包的缺点
闭包的缺点是使用不当的时候,有可能会造成内存泄露。闭包使用不当时,在某个版本的IE下会导致内泄露,这个是旧版本IE的bug导致的。
const fn = function () {
var text = '我是很长的一段文字...'
var count = 1
return function add() {
count += 1
return count
}
}()
var myFn = fn()
var myCount = myFn()
请问,上面代码的text会消失吗?正常情况下,text会被垃圾回收掉。但是旧版本的IE存在bug,导致text不会被垃圾回收,造成了内存泄露。
完。