这段代码为什么会出现循环引用?原理何在?function assignHandler() {
var element = document.getElementById('someElement');
element.onclick = function () {
alert(element.id);
};
}

解决方案 »

  1.   

    function assignHandler() {
        var element = document.getElementById('someElement');
        alert(element.id);//看看这个值
        element.onclick = function () {
            alert(element.id);//是否一样
        };
    }
      

  2.   

      IE中的内存泄漏有好几种,这里有详细的解释(http://msdn.microsoft.com/en-us/library/bb250448.aspx),园子里也有翻译了(http://www.cnblogs.com/birdshome/archive/2006/05/28/ie_memoryleak.html)。   这里只讨论其中一种,即循环引用所造成的内存泄漏,因为,这是一种最普遍的情况。   当在DOM元素或一个ActiveX对象与普通JavaScript对象之间存在循环引用时,IE在释放这类变量时存在特殊的困难,最好手动切断循环引用,这个bug在IE 7中已经被修复了(http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)。   “IE 6 suffered from memory leaks when a circular reference between several objects, among which at least one DOM node, was created. This problem has been solved in IE 7. ”   如果上面的例子(第4点)中obj引用的不是一个JavaScript Function对象(inner),而是一个ActiveX对象或Dom元素,这样在IE中所形成的循环引用无法得到释放。    function init(){
            var elem = document.getElementByid( 'id' );
            elem.onclick = function(){
                alert('rain-man');
                //这里引用了elem元素
            };
        }  Elem引用了它的click事件的监听函数,同样该函数通过其作用域链也引用回了elem元素。这样在IE中即使离开当前页面也不会释放这些循环引用。