搜尋

首頁  >  問答  >  主體

javascript - 為什麼下面這段程式碼會出現記憶體洩漏?

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);

問題1:函數在創建的時候聲名上下文,在執行的時候將局部變量更新置作用域鏈中,作用域鏈在執行的時候包含函數內部的局部變量,比較疑惑的是unused函數未被執行,怎麼知道unused函式一定會引用originalThing的?
問題2:這段記憶體外洩怎麼解釋,希望大牛能解釋地詳細一點?

phpcn_u1582phpcn_u15822751 天前456

全部回覆(1)我來回復

  • 过去多啦不再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);
        }
      };

    回覆
    0
  • 取消回覆