エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

JavaScriptでメモリが解放される時は?ガベージコレクション【75日目】

ガベージコレクション

結論:参照をされなくなったときに解放される。

クロージャを参考に

willow710kut.hatenablog.com

前の記事から少し改変。

var func = function () {
  var value = 1;

  return function () {
    value++;
    console.log(value); // 2?
  };
}();

このプログラム何してる?

まずreturnを簡単なものに変えます。

var func = function () {
  var value = 1;

  return x;
}();

そして、無名関数のfunction(){xxx}のすぐ後に()があります。
つまり、即時関数ということで、すぐに結果が実行されます。

したがって、

var func = x;

になると。このxは

 function () {
    value++;
    console.log(value); // 2?
  }

これなので、funcに関数が入るわけですね。

ここで疑問。

このfuncを動かしまくると、234とどんどん増えていきます。

でもあれ?このfuncの中のvalue++;一体どこのvalue使ってるの?
即時関数内のvar value = 1;なら、もう使い終わってどっかにいったのでは??

ガベージコレクションの考え方

ここで結論を思い出す。

このfuncに入ったクロージャは、外のvar value = 1;を参照していた。
したがって、このvar value = 1;は参照され続けているため、
即時関数で使われた後も、参照され続けている限り、メモリに残り続ける。

日記

きっかけはリーダブルコードの例のプログラムでした。

このプログラムなんで動いてるんだろうって思って必死に考えて、先輩方にいろいろ質問してわかったやつ。
クロージャの特性、ガベージコレクションとか、全然理解してなかったし頭から吹っ飛んでた。

日々学び続けてこそ、定着するものだなと……出来れば一発で定着させたいけど、なかなか難しい。

そういや、今日はエンジニアで忘年会だったのですが、しんどくて先に帰ったらふっつーに熱ありました。

途中抜けしたくなかったよおおおおおおもっと元気におしゃべりしたかったし、カキフライも食べたかったよおおおお(´;ω;`)←