내가 어떻게 circular references cause memory leaks in IE에 대해 읽고 있었다, 그러나 나는 순환 참조 휴식을 폐쇄 내에서 클로저를 사용하는 예에 꽤 혼란스러워했다 :이중 폐쇄가 순환 참조를 끊는 방법은 무엇입니까?
function addHandler() {
var clickHandler = function() {
this.style.backgroundColor = 'red';
};
(function() {
var el = document.getElementById('el');
el.onclick = clickHandler;
})();
}
내 머리가 모두 폐쇄가있는 무엇에 언급 된 것과 wrangled있어를 , 이는 스코프 객체이다. 누군가 MDN보다 명시 적으로 더 자세히 설명 할 수 있습니까? 감사. 당신이
function addHandler() {
var clickHandler = function() {
this.style.backgroundColor = 'red';
// can access `el` here
};
var el = document.getElementById('el');
el.onclick = clickHandler;
}
이 있다면
첫 번째 예에서 'el'이 'clickHandler'에서 명시 적으로 참조되지 않았더라도 'el'은 여전히 clickHandler의 범위 객체에 존재 했습니까? 즉, 'clickHandler' *가'el '을 참조 할 수 있다고해도'clickHandler'는 명시 적 참조가 있거나없는 'el' 참조에 액세스 할 수 있습니까? 따라서'clickHandler'의 scope 객체에서'el'과'el' 객체에서'clickHandler' 사이에 순환 참조를 생성합니까? 단지 clickHandler의'this' 문이 그 참조를 만드는 scope 객체가 아닌'el'에 대한 순환 참조를 일으키지 않았 음을 확실히하고 싶습니다. –
@TriNoensie : 아니요, '이'와 아무 관련이 없습니다. 함수가 생성되면 함수가 작성된 "범위"에 대한 참조도 가져옵니다. 즉, 함수가 작성된 범위에서 액세스 할 수있는 모든 변수에 대한 암시 적 * 참조를 갖습니다. 그리고 이로 인해 IE에서 문제가 발생했습니다. –