小编SZR*_*SZR的帖子

Javascript内存泄漏:为什么将对象分配给null工作?

关于用于防止内存泄漏的赋值到空的修复的性质,有人可以为我抓痒吗?

我们都熟悉以下技术来停止DOM对象和JS对象之间的循环引用,以防止内存泄漏:

    function foo() {
      var ele = document.getElementById("someParagraphId");

      ele.onclick = function() {
        //some action here
      };

      ele = null;
    }
Run Code Online (Sandbox Code Playgroud)

问题是为什么上述工作?将"ele"设置为null肯定会停止循环引用,但它是否也会阻止将来引用"ele"?

    function foo() {
      var ele = document.getElementById("someParagraphId");

          ele.onclick = function() {
              console.log("accessing ele ... after set to null " + ele.onclick);
          };

      ele = null;

    }
Run Code Online (Sandbox Code Playgroud)

然而事件听众却开火了.它会抱怨"ele"对象为null(这是我们所期望的).

鉴于上述行为,我们是否正确推断Javascript引擎实现将保留对事件侦听器的某种内部引用,并且在触发事件时调用此引用?

eventHandlerRef = //assignment to "ele.onclick" handler/listener;
Run Code Online (Sandbox Code Playgroud)

如果有如上所述的引用,那么赋值为null的修复是否依赖于实现?或者,它是ECMAScript规范的一部分.

从我的理解,这个修复一直是跨浏览器安全的.在应用null赋值之前,我没有遇到过许多关于检测/嗅探浏览器类型的具体提及的示例.

===============编辑==================

我认为由于我提出的方式,问题可能会在不知不觉中直接从我试图传达的内容中进行讨论.正在引用的几个概念:

对象句柄/对象引用ala:

 var obj1, obj2;
     obj1 = {foo: "bar"}; //obj1 points to the an area of the heap allocated 
                          //for the …
Run Code Online (Sandbox Code Playgroud)

javascript javascript-events circular-reference

6
推荐指数
2
解决办法
2621
查看次数