suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript - Warum führt der folgende Code zu Speicherverlusten?

var theThing = null;
var replaceThing = function () {
  var originalThing = theThing;
  var unused = function () {
    if (originalThing)
      console.log("hi");
  };

  theThing = {
    longStr: new Array(1000000).join('*'),
    someMethod: function () {
      console.log(someMessage);
    }
  };
};

setInterval(replaceThing, 1000);

Frage 1: Die Funktion deklariert den Kontext, wenn sie erstellt wird, und aktualisiert die lokalen Variablen in der Bereichskette, wenn sie ausgeführt wird. Die Bereichskette enthält lokale Variablen innerhalb der Funktion, wenn sie ausgeführt wird . Woher wissen Sie, dass die nicht verwendete Funktion definitiv auf originalThing verweist?
Frage 2: Wie lässt sich dieses Speicherleck erklären? Ich hoffe, die Experten können es genauer erklären?

phpcn_u1582phpcn_u15822753 Tage vor457

Antworte allen(1)Ich werde antworten

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-19 10:33:11

    • 问题1: function(replaceThing)内的变量在离开了它的作用域后,如果这个function(replaceThing)在使用一次后,直到程序执行完也没有再引用,过一段时间就会被回收。

    • 问题2: 你看看thething赋值动作,其中的创建数组动作可是一直在做,一次1000000做join操作,不断执行,内存回收的速度跟不上它增长的速度,很快导致内存泄露。

      theThing = {
        longStr: new Array(1000000).join('*'),
        someMethod: function () {
          console.log(someMessage);
        }
      };

    Antwort
    0
  • StornierenAntwort