我正在阅读有关循环引用如何导致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] 删除。
我来说两句