概要
JavaScript勉強中の初学者です。
JS Primerを読んでいて不明なところがありご質問させていただければと思います。
ご質問箇所
▼該当箇所
https://jsprimer.net/basic/map-and-set/#weakmap
WeakMapについて学んでおり、弱い参照でGCからのメモリ解放を妨げないためにメモリリークを起こさないようにできる、という概要はなんとなく理解できました。
その中で、WeakMapの欄にある使用例の処理について、いまいち何をしているのか、また何を意図してそうなっているのかがソースコードから読み解けず、お知恵をお貸しいただけると幸いです。以下該当の箇所の引用です。
// イベントリスナーを管理するマップ const listenersMap = new WeakMap(); class EventEmitter { addListener(listener) { // this にひもづいたリスナーの配列を取得する const listeners = listenersMap.get(this) ?? []; const newListeners = listeners.concat(listener); // this をキーに新しい配列をセットする listenersMap.set(this, newListeners); } } // 上記クラスの実行例 let eventEmitter = new EventEmitter(); // イベントリスナーを追加する eventEmitter.addListener(() => { console.log("イベントが発火しました"); }); // eventEmitterへの参照がなくなったことで自動的にイベントリスナーが解放される eventEmitter = null;
考えたこととご質問
- addListenerメソッドは、あくまでイベント発火時にのみMapを参照できていればよくその他の時はMapへの参照を持っておく必要がないため、メモリを解放するためにわざわざこのような実装にしている?
this (クラスインスタンス) を WeakMap のキーにすることで、インスタンスの外からはアクセスできない値を保持できます。
とJS Primerにはありましたが、そうしなかった場合、どんな問題があり得るのでしょうか?(つまり、インスタンスの外から値がアクセスできてしまう)- 本旨とずれるかもしれませんが、このaddListenerメソッドは結局のところ何をしているのでしょうか?
2の質問のように、インスタンス自身を新たなkeyとしてセットし、今までsetしたイベントリスナーと合体した配列を値にセットしている、ということはわかるのですが、それで一体どんなことが嬉しいのかいまいちイメージできません。イベント発火ごとに発火時の記録を格納していく、みたいなことでしょうか。。
基本的なことが抜け落ちているかもしれず、また例のコードなのでいろいろな想定ができるかとは思うので漠然としたご質問になり恐縮ですが、
宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/12 06:24