質問: ### 用語集 解説サイトA= https://logmi.jp/tech/articles/322067 画像A= https://img.logmi.jp/article_images/CnNjsbCDuXcau2y612zVvW.jpg 画像B= https://img.logmi.jp/article_images/8ueUvyGywcmH2rx8eTssCM.jpg ### 抱えている問題・実現したいこと html・css・javascriptでゲームを作っているが、 「このwebページは多くのメモリを使用しています」と警告が出る。 無視していると強制的にブラウザがページを再読み込みさせてしまうらしい。 ゲームプレイ途中にページが再読み込みされて処理がリセットされては困るので メモリリークについて理解し、対策を取りたい。 ### 前提 いろいろ解説サイトを読んだが、中でもゲームについて言及している 解説サイトAをメインで読んでいます。 解説サイトAによるとクロージャーがメモリに関係ありそうなので、理解をしたいが、難しくて理解できないです。 ### ガベージコレクションが発揮される条件が不明 画像Aに対して「ルートオブジェクトからたどれるものは消せないルール。だから、globalObjから辿り、something関数、NOT_USE_CLOSURE関数、localClosure変数は繋がりがあるので逐一消せなくなります」とありますが、globalObjはleakSampleスコープの中にあるのでルートオブジェクトではありませんよね?それともルートオブジェクトである「var test」のイコールの右辺の中にあるものは全てルートオブジェクトから辿れるとみなされるのですか? ### クロージャーを使わないケースを理解できない 解決先としてクロージャーを使わないソース(画像B)が載っていますが、このソースもクロージャーを使っていませんか?解説サイトAには「別のスコープのローカル変数を参照できる仕組み自体がクロージャ」とありました。画像Bにおいては、nonLeakSampleスコープのローカル変数であるglobalObjを、NOT_USE_CLOSURE関数スコープ内で参照しているので、そう思いました。 ### 備考 以前 に質問しましたが、1つの実現したいこと・抱えている問題に対して課題が複数あったので、課題ごとに分けて質問する為、その理由を添えて削除依頼しました。削除依頼は運営にも受理され、現在は削除されています。運営に受理されたということで複数に分けて質問させていただきます。
回答: > > ガベージコレクションが発揮される条件が不明 > > > この記述内容を議論する以前の問題として、ブラウザによっては**最適化**が行われますので、「スコープから見えているけどまったく参照もされない変数」は消えていることがあります。クロージャから読み書きが行われる変数は、もちろん必要なものなので最適化しても消せません。 (正直言って、実際にそこで行き詰まっているとはっきりしているのでなければ、こんな細かい挙動を追いかけても仕方ありません。)