###用語集
解説サイト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関数スコープ内で参照しているので、そう思いました。
備考
以前
https://teratail.com/questions/280194
に質問しましたが、1つの実現したいこと・抱えている問題に対して課題が複数あったので、課題ごとに分けて質問する為、その理由を添えて削除依頼しました。削除依頼は運営にも受理され、現在は削除されています。運営に受理されたということで複数に分けて質問させていただきます。
回答2件
あなたの回答
tips
プレビュー