什么是闭包?闭包有哪些应用场景?
简单来说,闭包就是一个函数及其捆绑的周边环境状态的引用的组合。
闭包的主要应用场景包括:
闭包是 JavaScript 中的一个重要概念,指的是函数能够访问其词法作用域中的变量,即使函数在其词法作用域之外执行。
示例代码:
function outer() {
let count = 0;
return function inner() {
count++;
console.log(count);
};
}
const counter = outer();
counter(); // 输出 1
counter(); // 输出 2
口语化解释:outer
函数返回了 inner
函数,inner
函数可以访问 outer
函数中的 count
变量,即使 outer
函数已经执行完毕。这就是闭包。闭包常用于实现私有变量、函数柯里化、模块化等。
大部分场景就是为了实现私有状态和限制访问方式。
B站有一个视频 https://b23.tv/j470iml 我以前一直在看。
OP你可以去看一下,我个人觉得已经讲的很通俗易懂了。
但是你得一直去复习或者自己总结一篇笔记,这样才好帮助自己加深记忆。
以下内容来自 AI:
闭包是 JavaScript 中函数与其定义时的词法环境(外部作用域)的组合,允许内部函数访问并记住外部函数的变量,即使外部函数已执行完毕。这种特性使得闭包能够实现状态持久化和数据封装。
数据封装与私有变量
示例:计数器
function createCounter() {
let count = 0;
return {
increment: () => ++count,
getCount: () => count
};
}
const counter = createCounter();
counter.increment(); // 1
counter.getCount(); // 1
count
变量,外部无法直接修改。函数工厂
示例:动态生成问候语
function greetingFactory(greeting) {
return name => `${greeting}, ${name}!`;
}
const sayHello = greetingFactory('Hello');
sayHello('John'); // "Hello, John!"
防抖(Debounce)与节流(Throttle)
防抖示例:
function debounce(func, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => func.apply(this, args), delay);
};
}
const search = debounce(() => fetchData(), 300);
模块化开发
示例:购物车模块
const CartModule = (function() {
let items = [];
return {
addItem: item => items.push(item),
getItems: () => [...items]
};
})();
异步操作与回调
示例:事件监听
function setupButton(buttonId) {
const button = document.getElementById(buttonId);
button.addEventListener('click', () => {
console.log(`Button ${buttonId} clicked`);
});
}
IIFE(立即执行函数)
示例:隔离作用域
(function() {
let config = { key: 'secret' };
window.getConfig = () => config;
})();
循环中闭包的变量共享问题:
for (var i = 1; i <= 3; i++) {
setTimeout(() => console.log(i), 100); // 输出 4, 4, 4
}
解决方案:使用闭包或 let
块级作用域:
for (let i = 1; i <= 3; i++) {
setTimeout(() => console.log(i), 100); // 输出 1, 2, 3
}
闭包是 JavaScript 函数式编程的核心特性之一,合理使用可提升代码的封装性和灵活性,但需注意内存管理和性能优化。
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
闭包(Closure)是指在一个函数内部定义的函数可以访问其外部函数的作用域中的变量。闭包使得内部函数可以“记住”并访问定义它时的环境。
例子如下: