前端
闭包的理解 - 备忘
什么是闭包?
闭包本质上是一个绑定了执行环境的函数,携带了执行时的环境信息。 简单来说, 闭包让你可以从内部函数访问外部函数的作用域。 在现代 JavaScript 标准中,执行环境包含词法环境、变量环境、this 值、代码执行状态等。
闭包的工作原理
function outerFunction(x) {
let y = 10;
function innerFunction() {
console.log(x + y);
}
return innerFunction;
}
const closure = outerFunction(5);
closure(); // 输出 15
在这个例子中:
outerFunction
返回innerFunction
innerFunction
可以访问outerFunction
的变量x
和y
- 即使
outerFunction
已经执行完毕,closure
仍然可以访问x
和y
闭包的实际应用
- 数据隐私
function counter() {
let count = 0;
return function() {
count++;
console.log(count);
}
}
const increment = counter();
increment(); // 1
increment(); // 2
- 函数工厂
自己实现一个防抖和节流
function debounce(fn, delay) {
let timer;
return function(...args) {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
}
}
function throttle(fn, delay) {
let lastExecTime = 0;
return function(...args) {
const now = Date.now();
if (now - lastExecTime < delay) return;
lastExecTime = now;
fn.apply(this, args);
}
}
闭包的优缺点
优点:
- 数据封装
- 实现私有变量和方法
- 创建函数工厂
缺点:
- 可能导致内存泄漏
- 在某些情况下可能影响性能。