- 核心特性:
- 核心背景:
- 自由变量的查找,是在函数定义的地方,向上级作用域查找,不是在执行的地方
- 闭包的应用场景:
- 私有变量(模拟封装)
function createCounter() {
let count = 0 // 私有变量,外部无法直接访问
return {
increment: () => ++count,
decrement: () => --count,
getCount: () => count,
}
}
const counter = createCounter()
console.log(counter.increment()) // 1
console.log(counter.increment()) // 2
console.log(counter.getCount()) // 2
console.log(counter.count) // undefined(外部无法直接访问)
- 回调 & 事件监听
function addEventLogger(eventName) {
return function () {
console.log(`Event ${eventName} triggered!`)
}
}
document.addEventListener('click', addEventLogger('click'))
- 定时器 & 异步操作
function delayedGreeting(name) {
setTimeout(() => {
console.log(`Hello, ${name}!`)
}, 2000)
}
delayedGreeting('Rain') // 2 秒后打印 "Hello, Rain!"
- 闭包的缺点:
- 可能导致内存泄漏
- 闭包会持有外部变量的引用,导致变量无法被垃圾回收
- 解决方案:手动将变量置为 null 或谨慎管理作用域
- 滥用闭包可能影响性能
- 每次调用都会创建新的作用域,影响垃圾回收机制
- 适度使用,避免不必要的闭包