HTML页面占用大量RAM

时间:2018-07-01 04:37:40

标签: javascript html dom

内存使用率很高,但未显示任何内容。页面不断加载。

<html>
<title>Array</title>
<body onload="myFunction()">
  <center>
    <p id="demo">This is an array</p>
  </center>
  <script>
    var globe;
    var i = 0;

    function myFunction() {
      var sl = ["a", "b", "c", "d", "d", "e", "f"];
      for (i = 0; i < 7; i) {
        globe = sl[i];
        setTimeout(pk, 50);
      }
    }

    function pk() {
      document.write(globe);
      i++;
      myFunction();
    }
  </script>
</body>

</html>

有人可以向我解释一下,该脚本中实际上发生了什么吗?

4 个答案:

答案 0 :(得分:2)

非正式地,您可以想到所有js代码都在单个线程上执行。 setTimeout(f,n)的作用是在至少n毫秒过去并且该线程处于空闲状态时执行函数f。由于myFunction从不返回,因为它不会在内部递增i,所以该线程永不会变为空闲状态,并且永远不会调用pk。大量的计划调用消耗了内存。

解决此问题时,请记住,pk和myFunction之间也具有相互递归关系,这也会使浏览器产生大量调用,从而使之过载。

答案 1 :(得分:1)

简单的HTML永远不要使用大量的RAM,如果发生这种情况,您必须确保有一个JavaScript代码用于实现引起此问题的交互。

对于您的特殊代码,您的问题肯定是您的JavaScript代码,您的for循环写得不好。看到:

for(i = 0;i < 7;i) // the last i must be i++
{
   globe = sl[i];
   setTimeout(pk,50);
}

在第三个i循环中,您的循环将无限执行,因此在第三部分中,您必须声明i++步骤,更改代码,然后您会发现它很棒。

祝你好运

答案 2 :(得分:0)

基本上,为了对上述答案进行一点推断,循环内的变量永远不会增加,因此循环将无限期地运行。

您正在i函数中递增pk(),但是该函数永远不会运行,因为您的应用程序会陷入无限循环。

答案 3 :(得分:0)

在循环中添加i ++可以解决问题。

您甚至可以使用

for (items in sl){
    //whatever code you want
}

此for ... in循环为您带来的好处是,您可以横向排列任意大小的数组