双闭包如何破坏循环引用?

三诺西

我正在阅读有关循环引用如何导致IE中内存泄漏的信息,但是我对使用闭包内的闭包破坏循环引用的示例感到非常困惑:

function addHandler() {
    var clickHandler = function() {
        this.style.backgroundColor = 'red';
    };
    (function() {
        var el = document.getElementById('el');
        el.onclick = clickHandler;
    })();
}

我的头都对引用什么,哪些是闭包,哪些是作用域对象感到困惑。有人可以比MDN更明确地细分它吗?谢谢。

费利克斯·克林

如果你有

function addHandler() {
    var clickHandler = function() {
        this.style.backgroundColor = 'red';
        // can access `el` here
    };
    var el = document.getElementById('el');
    el.onclick = clickHandler;
}

然后el引用clickHandler,但clickHandler也引用el,因为它是一个闭包。->循环引用(在IE中)

通过引入新的范围,你让el 地方,所以它不是通过访问clickHandler->没有循环引用。

function addHandler() {
    var clickHandler = function() {
        this.style.backgroundColor = 'red';
        // cannot access `el` here
    };
    (function() {
        // `el` is local to this immediately invoked function
        var el = document.getElementById('el');
        el.onclick = clickHandler;
    })();
}

因此,解决内存泄漏问题的方法不是引入另一个闭包,而是创建一个新的作用域,该作用域将值相互“屏蔽”(至少在一个方向上)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

双闭包如何破坏循环引用?

来自分类Dev

如何从闭包返回对闭包参数的引用?

来自分类Dev

闭包如何存储对常量或值的引用

来自分类Dev

这种模式是否在闭包中引起循环引用?

来自分类Dev

Coffescript 闭包 _this 引用在嵌套循环中丢失

来自分类Dev

如何在Swift中设置对闭包/函数的弱引用?

来自分类Dev

如何在闭包中更改引用传递的数组的数据

来自分类Dev

闭包是通过引用捕获的?

来自分类Dev

如何在循环内的闭包中保留参数?

来自分类Dev

如何在循环内的闭包中保留参数?

来自分类Dev

如何快速在for循环中使用闭包?

来自分类Dev

循环执行func闭包

来自分类Dev

在循环中修复闭包

来自分类Dev

JavaScript闭包和for循环

来自分类Dev

如何“修改”闭包

来自分类Dev

如何同步闭包?

来自分类Dev

如何将可变引用捕获到从闭包返回的迭代器中包含的移动闭包中

来自分类Dev

闭包中变量引用的异常行为

来自分类Dev

在Swift中对闭包的引用很少

来自分类Dev

闭包不能返回引用吗?

来自分类Dev

是否可以从PHP的闭包返回引用?

来自分类Dev

停止在闭包中通过引用传递

来自分类Dev

如何存储多态闭包?

来自分类Dev

如何存储通用闭包?

来自分类Dev

循环,闭包和Javascript中的addEventListener

来自分类Dev

在闭包 Swift 中保留循环

来自分类Dev

php如何在定义对象之前在闭包中获取引用

来自分类Dev

Swift:如何通过完成处理程序(闭包)的引用存储对象数组?

来自分类Dev

如何向闭包添加生命周期参数而不返回引用