js闭包和内存释放
闭包的那些事儿
怎么写一个闭包
闭包是什么就不解释了,直接写一个闭包函数:
var f = function() { var num = 0; return function() { return num += 1; }; }
js中,函数是一等公民,定义一个函数f,它返回另一个可执行函数function() { return num += 1; };
js中的作用域,都是一层一层向上找的,在f内部函数里面,他的num向上找到父函数的作用域。
现在,我们执行一下:
f()() // 1 f()() // 1 ????? 感觉 不太对?为什么num没有自增呢??
内存回收机制
为什么上面执行结果不太对,因为执行f()()后,f函数已经执行完毕了,没有其他资源引用f,ta会被立即释放,也就是说,f()()执行完后,立即就释放了。
如何才不释放呢?
// 创建f的引用 var fn = f(); fn() // 1 fn() // 2 fn() // 3
这下就对了,num成了私有变量,f拥有了私有作用域。
完了吗?
f有了fn的引用,内存一直得不到释放,咋办呢?这样的函数多了是不是会造成内存溢出?
手动释放一下:
var fn = f(); fn() // 1 fn() // 2 fn() // 3 // 手动释放f的引用 fn = null // f的引用fn被释放了,现在f的作用域也被释放了。num再次归零了。 var fn = f() fn() // 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)