为什么这个延迟的WHILE循环导致大量内存泄漏?

时间:2014-05-04 20:37:02

标签: javascript while-loop settimeout tampermonkey

我从这个网站上的其他地方撕下了一个很好的技巧,可以让你延迟循环的循环。我使用在TamperMonkey上运行的Javascript bot在Chrome版本34.0.1847.131 m中修改了一点我自己使用。

无论出于何种原因,一旦调用循环,就会开始发生MASSIVE内存泄漏(大约每秒40,000K-80,000K)并且它根本不循环。我的计算机已经崩溃了两次,因为我既没有准备也没有期待它。

功能

 //Tests if Bot is still connected
var connected = true;

function testConnection() {    //  create a loop function
   setTimeout(function () {    //  call a 3s setTimeout when the loop is called
                                //  your code here
      randQuery = "PING " + Math.floor((Math.random()*8234));  //Creates a value of "PING " plus a random number attatched to the end to ensure that window.find only matches with the new ping 

      document.getElementById('msg').value = randQuery; //Inputs the above-created value into the message box
      DoMessage();                                     //Submits what's in the message box. Fails if m.xat.com no longer has a connection to the chatroom.
      var connected = window.find(randQuery);  //If the above failed, randQuery will not be found, returning the value of "False". There's probably a better solution for this?

        if (connected == true) {
            sendMessage("succeeded"); //DEBUG
        }
        else {
            sendMessage("failed");  //DEBUG
            connected = false;
            Reb00t();              //Reloads the page if DoMessage() failed
        }


      while (connected == true) {    //  if bot is still connected, call the loop function
         testConnection();          //  ..  again which will trigger another 
      }                            //  ..  setTimeout()
   }, 9000)
}

setTimeout( function startPingLoop() {
    testConnection();                      //  start the loop
}
,1200);

我有什么东西搞砸了吗?我以前从未处理过内存泄漏。

Full Code

1 个答案:

答案 0 :(得分:3)

只要connected等于true,while循环就会一遍又一遍地闪烁,两者之间没有延迟。 while循环不是异步的 - 它会暂停脚本中的所有其他内容,直到它结束。

想象一个像自动代码编写器的循环。它编写的函数只要在括号中的语句为false之前就可以使用。

  while (connected == true) {
     testConnection();
  }

相当于写作:

  if (connected == true) {
     testConnection();
  }
  if (connected == true) {
     testConnection();
  }
  if (connected == true) {
     testConnection();
  }
  if (connected == true) {
     testConnection();
  }
  if (connected == true) {
     testConnection();
  }
  if (connected == true) {
     testConnection();
  }
  if (connected == true) {
     testConnection();
  }
  if (connected == true) {
     testConnection();
  }
  if (connected == true) {
     testConnection();
  }
...
只要connected等于true,就一遍又一遍地重复。因此,如果connected保持等于true,则while循环尝试编写无限长的代码,导致无限循环,直到testConnection()函数使连接等于false。如果你的计算机有无限的内存,这个无限长的代码会占用所有内存 - 但你的计算机没有无限的内存供应,所以它会崩溃。