什么是闭包
闭包是指有权访问另一个函数作用域中变量的函数,即一个作用域可以访问另外一个函数内部的局部变量
function say() {
var num = 2
function sayNum() {
console.log(num)
}
sayNum()
}
say()
什么时候需要闭包
当需要重复使用一个对象,但邮箱保护这个对象不被其他代码污染时就可以使用
闭包的作用
- 使得一个外部函数有权访问一个内部函数作用域
- 保护变量不被内存回收机制回收
- 避免全局变量被污染,方便调用上下文的局部变量,加强封装性
- 读取函数内部的变量
- 这些的值始终保持在内存中,不会在外层函数调用后被自动清除
闭包的优缺点
优点:
变量长期驻扎在内存中,避免全局变量的污染
缺点:
闭包长期占用内存,内存消耗很大,比起普通函数闭包对内存的占用更对,可能导致内存泄露,因此建议在使用完毕后,可以手动赋空值进行回收: fn = null
闭包的形成必备条件
- 需要访问作用域
- 函数嵌套(物理条件)
- 被嵌套函数在另一个外部作用域中被调用
闭包的缺点
比起普通函数闭包对内存的占用更对,因此建议在使用完毕后,可以手动赋空值进行回收: fn = null
闭包例子
// 累加器
function counter() {
// 秒数
let second = 0
function doCounter() {
// 到达10秒后停止
if(second === 10) {
clearInterval(recordSecond)
console.log('计时结束!')
return
}
second += 1
console.log(`${second}秒`);
}
return doCounter
}
// 得到累加器
const doCounterFn = counter()
console.log(doCounterFn);
const recordSecond = setInterval(function() {
// 调用累加器
doCounterFn();
}, 1000)