这个JavaScript代码会导致内存泄漏吗?

时间:2014-10-28 19:26:07

标签: javascript memory-leaks

我在我的一个程序中使用以下代码。它为HTML前端提供服务器推送。

一切都按预期工作,但经过一段时间的工作(几天)后,浏览器会占用所有内存并且计算机挂起并需要重新启动。

我的代码是否可能泄漏内存,或者问题出在浏览器中?我知道在某些情况下,糟糕的JavaScript代码可能会泄漏内存,只要我的JS技能接近于零......

代码本身:

 var keepAliveTimer = null;

 function gotActivity() {
   if (keepAliveTimer != null) clearTimeout(keepAliveTimer);
   keepAliveTimer = setTimeout(connect, 3000);
 }

function connect(){
  gotActivity();
  var source = new EventSource('/Events?');
  source.onmessage =
    function (event) {
      var N = event.data.split("=");
      var K=N.shift();
      var H = "";
      for (var i=0; i<N.length; i++) {
        if  (i>0) {H += "="};
        H += N[i];
      };

      var el = document.getElementById(K);

      if (el.hasAttribute("value")) {
        el.value = H;
      } else {
        el.innerHTML = H;
      };
    };
};

connect();    

this answer中建议使用此保持活动计时器机制。

EDIT1:再次阅读来源。何时释放创建的EventSource对象?根据我的理解,退出connect() source变量将被销毁,并且EventSource对象将永远存在。下一次调用connect()只会创建另一个这样的对象,而不会破坏旧对象。我对吗?

1 个答案:

答案 0 :(得分:0)

经过一些分析和测试,我得到了以下代码,似乎不再泄漏内存:

var keepAliveTimer = null;
var source = null;

function gotActivity() {
  if (keepAliveTimer != null) clearTimeout(keepAliveTimer);
  keepAliveTimer = setTimeout(connect, 3000);
}

function OnPush(event) {
  var N = event.data.split("=");
  var K=N.shift();
  var H = "";
  for (var i=0; i<N.length; i++) {
    if  (i>0) {H += "="};
    H += N[i];
  };

  var el = document.getElementById(K);

  if (el.hasAttribute("value")) {
    el.value = H;
  } else {
    el.innerHTML = H;
  };

  el = null;
  gotActivity();
};

function connect() {
  if (source != null) source.onmessage = null;
  source = null;    
  source = new EventSource('/Events?');
  source.onmessage = OnPush;
  gotActivity();      
}

connect();