JavaScript 闭包怎么理解

你平时用手机拍照片时,会不会有这种情况:刚拍了一张花的特写,突然想拍远处的山,又怕刚调好的“花的对焦参数”白调了?很多人会习惯性按一下“保存”,再切换到全景模式重新调,但其实手机早就有“临时保存参数”的功能——不用额外操作,只要你没退出拍照界面,之前的对焦、曝光参数就会一直跟着你,不管你怎么切换取景框,一回来就能直接用。

这和编程里的“闭包”特别像,只是换了个“代码场景”而已。很多人刚接触闭包时,总被“函数套函数”“变量保留”这些术语绕晕,其实只要用生活里的小事拆解,就能很快懂。

JavaScript 闭包怎么理解

先搞懂两个基础:函数和变量的“生存规则”

要理解闭包,得先记住两个简单的“生活规则”,对应代码里的逻辑:

第一个是“厕所规则”:就像你进公共厕所,关上门(创建一个函数),里面的卫生纸、洗手液(函数内部的变量)是你私人用的,外面的人(其他函数)没钥匙,碰不到也用不了;

第二个是“外卖规则”:你点外卖时填了“公司地址”,外卖员送到后,你在公司里才能拿到餐(函数内部的变量,只能在函数内部用),要是你直接把外卖单(函数)带回家,还一直拿在手里,那不管你到哪,都能凭这张单取餐——哪怕你已经离开了公司(外层函数执行完了)。

这两个规则,是理解闭包的核心,不用记复杂的定义,先把这俩对应上。

闭包其实就是“带外卖单的厕所”

结合刚才的规则,闭包可以这么通俗解释:外层函数创建了一个“私人厕所(内部函数)”,还把“外卖单(内部变量)”给了这个厕所,哪怕外层函数执行完“关门离开”了,这个厕所还能继续拿着外卖单,随时用里面的东西。

举个大家常写的例子:你写了个计数器功能,想每次点按钮数字就加1,要是不用闭包,代码大概是这样的:

function createCounter() {

let count = 0; // 这是“外卖单”

function add() { // 这是“私人厕所”

count += 1;

console.log(count);

}

return add; // 把“厕所”和“外卖单”一起递出去

}

const counter = createCounter(); // 外层函数执行完了,按规则“count应该没了”

counter(); // 输出1,再点一次输出2

要是没有闭包,外层函数createCounter执行完,里面的count变量会被“收走”,再调用counter时,根本找不到count,只会报错。但因为add函数(厕所)一直带着count的外卖单,哪怕createCounter已经关门走了,它还能一直用count,这就是闭包在起作用。

闭包不是“魔法”,是“规则的灵活应用”

很多人觉得闭包神秘,其实它只是把刚才的“厕所+外卖单”规则用在了代码里,平时写的很多功能,其实都在悄悄用到闭包:比如网页上的“点赞按钮点一次加1”、弹窗里“记住上次关闭的位置”,甚至你常用的前端工具库,都靠闭包实现“不被外界干扰的独立功能”。

最后要提醒的是,闭包虽然好用,但就像你一直拿着外卖单,要是随手乱扔,可能会被别人捡到(代码里就是变量一直不被释放,占内存),所以平时用的时候,不用刻意回避,只要用完后及时处理就行。

上一篇 Swift语言核心特性解析 助力移动端开发高效进阶