你在远程协作时,有没有遇到同事在代码里写了个函数,返回另一个函数,然后说‘这是闭包’?听起来挺玄乎,其实没那么复杂。
从一个实际场景说起
比如你和团队在开发一个在线文档协作工具,需要记录每个用户的操作次数。你不想把计数器暴露成全局变量,怕被误改。这时候就可以用闭包。
function createCounter() {
let count = 0;
return function() {
count++;
console.log(`操作次数:${count}`);
};
}
const myCounter = createCounter();
myCounter(); // 操作次数:1
myCounter(); // 操作次数:2
你看,count 是 createCounter 里面的变量,按理说外部访问不到。但内部返回的函数却能一直记住它,还能修改它。这种“函数记住了自己诞生时的环境”,就是闭包。
闭包的核心:函数+词法环境
闭包不是某个语言特有的黑科技,JavaScript、Python、Go 都支持。它的本质是:一个函数绑定了它定义时所在的上下文。
再举个例子,你在写一个远程会议权限控制模块:
function createUserChecker(role) {
return function(name) {
if (role === 'admin') {
console.log(`${name} 是管理员,允许进入会议室`);
} else {
console.log(`${name} 是普通成员,需等待授权`);
}
};
}
const checkAdmin = createUserChecker('admin');
const checkMember = createUserChecker('member');
checkAdmin('张伟'); // 张伟 是管理员,允许进入会议室
checkMember('李娜'); // 李娜 是普通成员,需等待授权
两个检查函数,各自“记住”了创建时传入的 role。这就是闭包带来的灵活性——不用每次调用都传一遍角色。
团队协作中,这种模式很常见。封装逻辑,避免重复参数,还能隐藏内部细节。别人调用你的函数时,只需要关心输入输出,不用管你里面怎么记状态。
所以下次看到嵌套函数,别光想着“套娃”,先想想是不是在用闭包解决实际问题。