<div id="Btn001" style="background:red; width:100px; height:100px" /></body>
var el=document.getElementById("Btn001");
el.onclick=function(){
  alert(123)
}
el=null
alert(el)
我以为我把el清空,回调函数没有被引用了,会被垃圾回收,可为什么每次点击div,依然可以弹出123来?

解决方案 »

  1.   

    绑定onclick在先,你仅仅把el设置为null,又没重置dom的click,所以依然有效
      

  2.   


    我一直把事件当类似于对象的方法来看,var obj=new Object()
    obj.method=function(){
      alert(123)
    }
    obj=null;
    obj.method()例如:obj=null了,obj.method自然也就被垃圾回收掉了,那我可不可以这样理解,只要元素对象被绑定了,el=null这句话暂时是无效的?el对象依然存在内存中,直到接触绑定后生效?
      

  3.   

    相信你看到的dom 绑定了事件,那么它就存在了
      

  4.   


    var el=document.getElementById("Btn001"); //el是一个变量,指向了一个dom对象
    el.onclick=function(){
      alert(123)
    }
    el=null//断开变量和dom对象之间的引用,但dom对象是依然存在的。
    alert(el);
      

  5.   


    感谢likeajin 这么说俺就懂了,也谢谢calmcrime 
      

  6.   

    你的onclick事件是绑定到dom元素中去了,el只不过引用了这个元素,el=null取消了对这个元素的引用,并不会影响这个元素自身,也不会取消已经绑定的事件;要清空事件绑定,还得依靠el变量去引用dom元素,然后el.onclick=null。
      

  7.   

    var el=document.getElementById("Btn001"); 
    el=document.getElementById("Btn001"); 
    el=document.getElementById("Btn001"); 还想问一下, 如果有三个这样的语句,是不是会有三个document.getElementById("Btn001"),Dom实体驻留在内存里?
      

  8.   

    dom是挂在dom树上的,那几个只是引用了dom对象。
      

  9.   

    你清空的是 el
    不是那个dom
    比如 你看到了 星星  现在你闭上眼睛 那么 星星确实还是存在
      

  10.   

    当文档被卸载时,dom树也会被从内存中卸载,这时要求dom节点除dom树外无其他变量引用,否则不会被视为可回收资源。如果dom节点被任意一个变量引用而卸载时没断开,那么这个节点对象不会从内存中卸载,这时就造成了传说中的内存泄漏,常见于循环引用。
      

  11.   

    当对象没有被生存的变量持有时,资源会释放
    你这儿只是将对象的一个引用释放了,但页面中的html等效于全局变量,相当于资源仍然被全局变量持有,是不会被释放的.
      

  12.   

    请使用 removeChild 移除dom