关于js闭包之小问题大错误

闭包是 JavaScript 开发的一个关键方面:匿名函数可以访问父级作用域的变量。

如果闭包的作用域中保存着一个 HTML 元素,则该元素无法被销毁。(下面代码来自高程)

刚看到一个关于闭包自己没注意到的地方,

function assgin() {
    var ele = document.getElementById('someEle');
    ele.onclick = function(){
        alert(ele.id);
    }
}

以上代码创建了一个作为 ele 元素事件处理程序的闭包,而这个闭包有创建了一个循环的引用,由于匿名函数保存了一个 assgin() 的活动对象的引用 ,因此无法减少对 ele 的引用次数 , 只要匿名函数存在,ele的引用次数至少是 1。我们可以稍微改写一下:

function assgin() {
    var ele = document.getElementById('someEle');
    var id = ele.id
    ele.onclick = function(){
        alert(id);
    }
    ele = null;
}

上面代码中,通过把 ele.id 的一个副本保存在一个变量中,并且在比保重引用该变量消除了循环引用,但是这样还不能解决内存泄露,闭包会引用包含函数的整个活动对象,而其中包含着 ele ,即使闭包不直接引用 ele ,包含函数的活动对象中也会保存 一个引用,因此需要把 ele 变量设置为 null ,这样就解除了对 DOM 对象的引用,减少其引用数,确保能正常回收。

翻看之前关于闭包的文章,确实学习不足   深入理解JS闭包(https://www.cnblogs.com/7qin/p/9740799.html)

摘自:https://segmentfault.com/a/1190000010477169

posted @   笠航  阅读(254)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示