HTML-страница, потребляющая много оперативной памяти - PullRequest
0 голосов
/ 01 июля 2018

Использование памяти высокое, но ничего не отображается. Страница продолжает загружаться.

<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 голосов
/ 01 июля 2018

Неформально вы можете представить, что весь ваш js-код выполняется в одном потоке. Что setTimeout (f, n) делает, так это выполняет функцию f, когда прошло не менее n миллисекунд, и этот поток простаивает. Поскольку myFunction никогда не возвращается, так как она не увеличивает i внутри, поток никогда не становится бездействующим, и pk никогда не вызывается. Память используется огромным количеством запланированных звонков.

Когда вы исправите это, помните, что у вас также есть взаимная рекурсия между pk и myFunction, которая также перегружает ваш браузер огромным количеством вызовов.

0 голосов
/ 01 июля 2018

Добавление i ++ in loop решает проблему.

Вы даже можете использовать

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

Это для ... в цикле дает вам преимущество, что вы можете поперечный массив любого размера

0 голосов
/ 01 июля 2018

Простой HTML никогда не используйте много суммы RAM, если это произойдет, вы должны быть уверены, что существует код JavaScript для реализации взаимодействия, вызвавший эту проблему.

Для вашего специального кода ваша проблема - определенно ваш код JavaScript, ваш цикл for написан плохо. см:

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

С третьим i ваш цикл действует бесконечно, поэтому в третьем разделе вы должны объявить step, i++, изменить ваш код, и вы увидите, что он работает потрясающе.

Удачи

0 голосов
/ 01 июля 2018

По сути, чтобы немного экстраполировать приведенные выше ответы, переменная внутри цикла никогда не увеличивается, поэтому цикл будет работать бесконечно.

Вы увеличиваете i в своей функции pk(), но эта функция никогда не запускается, поскольку ваше приложение останавливается в бесконечном цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...