У ÑÑй ÑÑаÑÑÑ ÑозглÑдаÑÑÑÑÑ Ð´Ñже вÑзÑкоÑпÑÑмована Ñема, з ÑÐºÐ¾Ñ Ð±ÑлÑÑÑÑÑÑ ÑозÑобникÑв на пÑакÑиÑÑ ÑÑикаÑÑÑÑÑ Ð½Ð°Ð´Ð·Ð²Ð¸Ñайно ÑÑдко (а можÑÑÑ Ñ Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð½Ðµ знаÑи пÑо ÑÑ ÑÑнÑваннÑ).
Ðи ÑекомендÑÑмо пÑопÑÑÑиÑи Ñей ÑоздÑл, ÑкÑо ви ÑÑлÑки поÑали вивÑÐµÐ½Ð½Ñ JavaScript.
ÐгадÑÑÑи оÑÐ½Ð¾Ð²Ð½Ñ ÐºÐ¾Ð½ÑепÑÑÑ Ð¿ÑинÑÐ¸Ð¿Ñ Ð´Ð¾ÑÑжноÑÑÑ Ð· ÑоздÑÐ»Ñ ÐбиÑÐ°Ð½Ð½Ñ ÑмÑÑÑÑ, ми можемо вÑдзнаÑиÑи, Ñо ÑÑÑÑй JavaScript гаÑанÑовано збеÑÑÐ³Ð°Ñ Ñ Ð¿Ð°Ð¼âÑÑÑ Ð·Ð½Ð°ÑеннÑ, ÑÐºÑ Ð´Ð¾ÑÑÐ¶Ð½Ñ Ð°Ð±Ð¾ викоÑиÑÑовÑÑÑÑÑÑ.
ÐапÑиклад:
// Ñ Ð·Ð¼ÑннÑй user знаÑ
одиÑÑÑÑ ÑилÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'ÑкÑ
let user = { name: "John" };
// пеÑезапиÑемо знаÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ user
user = null;
// поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð²ÑÑаÑаÑÑÑÑÑ Ñ Ð¾Ð±'ÑÐºÑ Ð±Ñде видалено з пам'ÑÑÑ
Ðбо ÑÑ Ð¾Ð¶Ð¸Ð¹, але ÑÑÐ¾Ñ Ð¸ ÑкладнÑÑий код Ñз двома ÑилÑними поÑиланнÑми:
// Ñ Ð·Ð¼ÑннÑй user знаÑ
одиÑÑÑÑ ÑилÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'ÑкÑ
let user = { name: "John" };
// ÑкопÑÑвали ÑилÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'ÑÐºÑ Ñ Ð·Ð¼ÑÐ½Ð½Ñ admin
let admin = user;
// пеÑезапиÑемо знаÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ user
user = null;
// об'ÑÐºÑ Ð²Ñе Ñе доÑÑÑпний ÑеÑез змÑÐ½Ð½Ñ admin
ÐбâÑÐºÑ { name: "John" } видалиÑÑÑÑ Ð· памâÑÑÑ ÑÑлÑки в ÑÐ°Ð·Ñ Ð²ÑдÑÑÑноÑÑÑ ÑилÑниÑ
поÑÐ¸Ð»Ð°Ð½Ñ Ð½Ð° нÑого (Ñкби ми Ñакож пеÑепÑизнаÑили знаÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ admin).
У JavaScript ÑÑнÑÑ ÐºÐ¾Ð½ÑепÑÑÑ Ð¿Ñд Ð½Ð°Ð·Ð²Ð¾Ñ WeakRef, Ñка пÑаÑÑÑ ÑÑоÑ
и ÑнакÑе в ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ.
СилÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ â Ñе поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° обâÑÐºÑ Ð°Ð±Ð¾ знаÑеннÑ, Ñке запобÑÐ³Ð°Ñ ÑÑ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ. ÐÑи ÑÑомÑ, збеÑÑгаÑÑи обâÑÐºÑ Ð°Ð±Ð¾ знаÑÐµÐ½Ð½Ñ Ð² памâÑÑÑ, на ÑÐºÑ Ð²Ð¾Ð½Ð¾ вказÑÑ.
Це ознаÑаÑ, Ñо обâÑÐºÑ Ð°Ð±Ð¾ знаÑÐµÐ½Ð½Ñ Ð·Ð°Ð»Ð¸ÑаÑÑÑÑÑ Ð² памâÑÑÑ Ð¹ не видалÑÑÑÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ Ð´Ð¾Ñи, доки на Ð½Ð¸Ñ Ñ Ð°ÐºÑÐ¸Ð²Ð½Ñ ÑилÑÐ½Ñ Ð¿Ð¾ÑиланнÑ.
У JavaScript ÑÑандаÑÑÐ½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° обâÑкÑи Ñ ÑилÑними поÑиланнÑми. ÐапÑиклад:
// змÑнна user мÑÑÑиÑÑ ÑилÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñей об'ÑкÑ
let user = { name: "John" };
Слабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ â Ñе поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° обâÑÐºÑ Ð°Ð±Ð¾ знаÑеннÑ, Ñке не запобÑÐ³Ð°Ñ ÑÑ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ. ÐбâÑÐºÑ Ð°Ð±Ð¾ знаÑÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑÑÑ Ð±ÑÑи Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ñ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ, ÑкÑо на Ð½Ð¸Ñ ÑÑнÑÑÑÑ ÑÑлÑки ÑÐ»Ð°Ð±ÐºÑ Ð¿Ð¾ÑиланнÑ.
WeakRef
ÐеÑÑ Ð½Ñж ми пеÑейдемо до вивÑеннÑ, ваÑÑо зазнаÑиÑи, Ñо пÑавилÑне заÑÑоÑÑÐ²Ð°Ð½Ð½Ñ ÑÑÑÑкÑÑÑ Ð· ÑÑÑÑ ÑÑаÑÑÑ, Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ Ð´Ñже ÑеÑелÑного обмÑÑковÑваннÑ, Ñ ÑкÑо Ñе можливо, ÑÑ Ð½Ñого викоÑиÑÑÐ°Ð½Ð½Ñ ÐºÑаÑе ÑникаÑи.
WeakRef â Ñе обâÑкÑ, Ñо мÑÑÑиÑÑ Ñлабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° ÑнÑий обâÑкÑ, Ñкий називаÑÑÑÑÑ target або referent.
ÐÑобливÑÑÑÑ WeakRef полÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо вÑн не пеÑеÑÐºÐ¾Ð´Ð¶Ð°Ñ Ð·Ð±Ð¸ÑаÑÐµÐ²Ñ ÑмÑÑÑÑ Ð²Ð¸Ð´Ð°Ð»ÑÑи ÑвÑй обâÑкÑ-ÑеÑеÑенÑ. ÐнÑими Ñловами, вÑн пÑоÑÑо не ÑÑÑимÑÑ Ð¹Ð¾Ð³Ð¾ âв живиÑ
â.
Ð¢ÐµÐ¿ÐµÑ Ð´Ð°Ð²Ð°Ð¹Ñе вÑзÑмемо змÑÐ½Ð½Ñ user в ÑкоÑÑÑ âÑеÑеÑенÑаâ Ñ ÑÑвоÑимо Ñлабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð²Ñд Ð½ÐµÑ Ð´Ð¾ змÑÐ½Ð½Ð¾Ñ admin.
Щоб ÑÑвоÑиÑи Ñлабке поÑиланнÑ, необÑ
Ñдно викоÑиÑÑовÑваÑи конÑÑÑÑкÑÐ¾Ñ WeakRef, пеÑедавÑи ÑÑлÑовий обâÑÐºÑ (обâÑкÑ, на Ñкий ви Ñ
оÑеÑе ÑÑвоÑиÑи Ñлабке поÑиланнÑ).
У наÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ â Ñе змÑнна user:
// Ñ Ð·Ð¼ÑннÑй user знаÑ
одиÑÑÑÑ ÑилÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'ÑкÑ
let user = { name: "John" };
// Ñ Ð·Ð¼ÑннÑй admin знаÑ
одиÑÑÑÑ Ñлабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'ÑкÑ
let admin = new WeakRef(user);
Ðа ÑÑ
ÐµÐ¼Ñ Ð½Ð¸Ð¶Ñе зобÑажено два Ñипи поÑиланÑ: ÑилÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð· викоÑиÑÑаннÑм змÑÐ½Ð½Ð¾Ñ user Ñ Ñлабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð· викоÑиÑÑаннÑм змÑÐ½Ð½Ð¾Ñ admin:
ÐоÑÑм, Ñ ÑкийÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñ, ми пеÑеÑÑаÑмо викоÑиÑÑовÑваÑи змÑÐ½Ð½Ñ user â вона пеÑезапиÑÑÑÑÑÑÑ, виÑ
одиÑÑ Ð· облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ ÑоÑо, пÑи ÑÑÐ¾Ð¼Ñ Ð·Ð±ÐµÑÑгаÑÑи екземплÑÑ WeakRef Ñ Ð·Ð¼ÑннÑй admin:
// пеÑезапиÑемо знаÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ user
user = null;
Слабкого поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° обâÑÐºÑ Ð½ÐµÐ´Ð¾ÑÑаÑнÑо, Ñоб збеÑегÑи його âв Ð¶Ð¸Ð²Ð¸Ñ â. Ðоли лиÑаÑÑÑÑÑ ÑÑлÑки ÑÐ»Ð°Ð±ÐºÑ Ð¿Ð¾ÑиланнÑ, збиÑÐ°Ñ ÑмÑÑÑÑ Ð¼Ð°Ñ Ð¿Ñаво зниÑиÑи обâÑÐºÑ Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи ÑÑ Ð¿Ð°Ð¼âÑÑÑ Ð´Ð»Ñ ÑогоÑÑ ÑнÑого.
Ðднак доÑи, доки обâÑÐºÑ ÑакÑиÑно не зниÑено, Ñлабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ повеÑнÑÑи його, навÑÑÑ ÑкÑо на Ñей обâÑÐºÑ Ð±ÑлÑÑе Ð½ÐµÐ¼Ð°Ñ ÑилÑÐ½Ð¸Ñ Ð¿Ð¾ÑиланÑ. ТобÑо Ð½Ð°Ñ Ð¾Ð±âÑÐºÑ ÑÑÐ°Ñ ÑвоÑÑÑдним âкоÑом ШÑедÑнгеÑаâ â ми не можемо знаÑи ÑоÑно, âживийâ вÑн Ñи âмеÑÑвийâ:
Ðа ÑÑÐ¾Ð¼Ñ ÐµÑапÑ, Ñоб оÑÑимаÑи обâÑÐºÑ Ð· екземплÑÑÑ WeakRef, ми викоÑиÑÑаÑмо його deref() меÑод.
ÐеÑод deref() повеÑÑÐ°Ñ Ð¾Ð±âÑкÑ-ÑеÑеÑенÑ, на Ñкий поÑилаÑÑÑÑÑ WeakRef, ÑкÑо обâÑÐºÑ Ð²Ñе Ñе пеÑебÑÐ²Ð°Ñ Ð² памâÑÑÑ. ЯкÑо обâÑÐºÑ Ð±Ñло видалено збиÑаÑем ÑмÑÑÑÑ, â меÑод deref() повеÑне undefined:
let ref = admin.deref();
if (ref) {
// об'ÑÐºÑ ÑÑе Ñе доÑÑÑпний: можемо здÑйÑниÑи бÑдÑ-ÑÐºÑ Ð¼Ð°Ð½ÑпÑлÑÑÑÑ Ð· ним
} else {
// об'ÑÐºÑ Ð±Ñло видалено збиÑаÑем ÑмÑÑÑÑ
}
ÐаÑÑанÑи викоÑиÑÑÐ°Ð½Ð½Ñ WeakRef
WeakRef зазвиÑай викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÐºÐµÑÑ Ð°Ð±Ð¾ аÑоÑÑаÑивниÑ
маÑивÑв, де збеÑÑгаÑÑÑÑÑ Ð²ÐµÐ»Ð¸ÐºÑ Ð¾Ð±âÑкÑи.
Це дозволÑÑ ÑникнÑÑи пеÑеÑÐºÐ¾Ð´Ð¶Ð°Ð½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑиÑ
обâÑкÑÑв збиÑаÑем ÑмÑÑÑÑ ÑÑлÑки на оÑÐ½Ð¾Ð²Ñ ÑÑ
нÑÐ¾Ñ Ð¿ÑиÑÑÑноÑÑÑ Ð² кеÑÑ Ð°Ð±Ð¾ аÑоÑÑаÑÐ¸Ð²Ð½Ð¾Ð¼Ñ Ð¼Ð°ÑивÑ.
Ðдин з оÑновниÑ
пÑикладÑв â Ñе ÑиÑÑаÑÑÑ, коли ми маÑмо Ð²ÐµÐ»Ð¸ÐºÑ ÐºÑлÑкÑÑÑÑ Ð¾Ð±âÑкÑÑв бÑнаÑниÑ
зобÑÐ°Ð¶ÐµÐ½Ñ (напÑиклад, пÑедÑÑавлениÑ
Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ ArrayBuffer або Blob), Ñ Ð¼Ð¸ Ñ
оÑемо повâÑзаÑи ÑмâÑ Ð°Ð±Ð¾ ÑлÑÑ
з кожним зобÑаженнÑм.
ÐÑнÑÑÑÑ ÑÑÑÑкÑÑÑи даниÑ
не зовÑÑм пÑдÑ
одÑÑÑ Ð´Ð»Ñ ÑакиÑ
ÑÑлей:
- ÐикоÑиÑÑаннÑ
MapÐ´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð·Ð²âÑÐ·ÐºÑ Ð¼Ñж Ñменами Ñа зобÑаженнÑми, або навпаки, збеÑеже обâÑкÑи зобÑÐ°Ð¶ÐµÐ½Ñ Ñ Ð¿Ð°Ð¼âÑÑÑ, оÑкÑлÑки вони ÑÑгÑÑÑÑÑÑ ÑMapÑк клÑÑÑ Ð°Ð±Ð¾ знаÑеннÑ. WeakMapÑакож не пÑдÑйде в ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ: ÑеÑез Ñе, Ñо обâÑкÑи, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ñ ÑкоÑÑÑ ÐºÐ»ÑÑÑвWeakMap, викоÑиÑÑовÑÑÑÑ ÑÐ»Ð°Ð±ÐºÑ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ Ð½Ðµ Ð·Ð°Ñ Ð¸ÑÐµÐ½Ñ Ð²Ñд Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ.
Ð¢Ð¾Ð¼Ñ Ð² ÑÑй ÑиÑÑаÑÑÑ Ð½Ð°Ð¼ поÑÑÑбна ÑÑÑÑкÑÑÑа Ð´Ð°Ð½Ð¸Ñ , Ñка б викоÑиÑÑовÑвала ÑÐ»Ð°Ð±ÐºÑ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ ÑвоÑÑ Ð·Ð½Ð°ÑеннÑÑ .
ÐÐ»Ñ ÑÑого ми можемо викоÑиÑÑаÑи колекÑÑÑ Map, знаÑеннÑми ÑÐºÐ¾Ñ Ð±ÑдÑÑÑ ÐµÐºÐ·ÐµÐ¼Ð¿Ð»ÑÑи WeakRef, Ñо поÑилаÑÑÑÑÑ Ð½Ð° поÑÑÑÐ±Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÑ Ð¾Ð±âÑкÑи.
ÐÑже, ми не збеÑÑгаÑимемо в памâÑÑÑ ÑÑ Ð²ÐµÐ»Ð¸ÐºÑ Ñа непоÑÑÑÐ±Ð½Ñ Ð¾Ð±âÑкÑи довÑе, нÑж ÑÑеба.
Ðа бÑлÑÑе Ñе ÑпоÑÑб оÑÑимаÑи обâÑÐºÑ Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð· кеÑÑ, ÑкÑо вÑн вÑе Ñе доÑÑÑпний. ЯкÑо ж вÑн бÑв видалений збиÑаÑем ÑмÑÑÑÑ, ми згенеÑÑÑмо або заванÑажимо його зновÑ.
Таким Ñином, Ñ Ð´ÐµÑÐºÐ¸Ñ ÑиÑÑаÑÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ Ð¼ÐµÐ½Ñе памâÑÑÑ.
ÐÑиклад â1: заÑÑоÑÑÐ²Ð°Ð½Ð½Ñ WeakRef Ð´Ð»Ñ ÐºÐµÑÑваннÑ
ÐижÑе мÑÑÑиÑÑÑÑ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ñ, Ñкий демонÑÑÑÑÑ ÑеÑ
нÑÐºÑ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ð½Ñ WeakRef.
Ðдним Ñловом, ми викоÑиÑÑовÑÑмо Map з ÑÑдками Ð´Ð»Ñ ÐºÐ»ÑÑÑв Ñа обâÑкÑами WeakRef Ñк ÑÑ
знаÑеннÑ.
ЯкÑо обâÑÐºÑ WeakRef не бÑв видалений збиÑаÑем ÑмÑÑÑÑ, ми беÑемо його з кеÑа.
У пÑоÑÐ¸Ð»ÐµÐ¶Ð½Ð¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð¼Ð¸ заванÑажÑÑмо його Ð·Ð½Ð¾Ð²Ñ Ñа ÑозмÑÑÑÑмо в ÐºÐµÑ Ð´Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑÑ Ð¿Ð¾Ð´Ð°Ð»ÑÑого повÑоÑного викоÑиÑÑаннÑ:
function fetchImg() {
// абÑÑÑакÑна ÑÑнкÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±ÑаженÑ...
}
function weakRefCache(fetchImg) { // (1)
const imgCache = new Map(); // (2)
return (imgName) => { // (3)
const cachedImg = imgCache.get(imgName); // (4)
if (cachedImg?.deref()) { // (5)
return cachedImg?.deref();
}
const newImg = fetchImg(imgName); // (6)
imgCache.set(imgName, new WeakRef(newImg)); // (7)
return newImg;
};
}
const getCachedImg = weakRefCache(fetchImg);
ÐавайÑе деÑалÑно ÑозбеÑемо вÑе, Ñо ÑÑÑ ÑÑалоÑÑ:
weakRefCacheâ Ñе ÑÑнкÑÑÑ Ð²Ð¸Ñого поÑÑдкÑ, Ñка пÑÐ¸Ð¹Ð¼Ð°Ñ ÑнÑÑ ÑÑнкÑÑÑfetchImgÑк аÑгÑменÑ. У ÑÑÐ¾Ð¼Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð¼Ð¸ можемо Ð·Ð½ÐµÑ ÑÑваÑи докладним опиÑом ÑÑнкÑÑÑfetchImg, оÑкÑлÑки Ñе може бÑÑи абÑолÑÑно бÑдÑ-Ñка логÑка заванÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±ÑаженÑ.imgCacheâ Ñе ÐºÐµÑ Ð·Ð¾Ð±ÑаженÑ, Ñкий збеÑÑÐ³Ð°Ñ ÐºÐµÑÐ¾Ð²Ð°Ð½Ñ ÑезÑлÑÑаÑи ÑÑнкÑÑÑfetchImg, з клÑÑами ÑÑдками (ÑмâÑ Ð·Ð¾Ð±ÑаженнÑ) Ñа обâÑкÑамиWeakRefÑк ÑÑ Ð·Ð½Ð°ÑеннÑ.- ÐовеÑÑаÑмо анонÑÐ¼Ð½Ñ ÑÑнкÑÑÑ, Ñка пÑÐ¸Ð¹Ð¼Ð°Ñ ÑмâÑ Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ñк аÑгÑменÑ. Ðаний аÑгÑÐ¼ÐµÐ½Ñ Ð±Ñде викоÑиÑÑовÑваÑиÑÑ Ñк клÑÑ Ð´Ð»Ñ ÐºÐµÑованого зобÑаженнÑ.
- ÐамагаÑмоÑÑ Ð¾ÑÑимаÑи кеÑований ÑезÑлÑÑÐ°Ñ Ð· кеÑÑ, викоÑиÑÑовÑÑÑи наданий клÑÑ (ÑмâÑ Ð·Ð¾Ð±ÑаженнÑ).
- ЯкÑо ÐºÐµÑ Ð¼ÑÑÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð·Ð° вказаним клÑÑем, Ñ Ð¾Ð±âÑкÑ
WeakRefне бÑв видалений збиÑаÑем ÑмÑÑÑÑ, повеÑÑаÑмо кеÑований ÑезÑлÑÑаÑ. - ЯкÑо в кеÑÑ Ð½ÐµÐ¼Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð»Ñ ÑÑого клÑÑа, або меÑод
deref()повеÑÑаÑundefined(Ñо ознаÑаÑ, Ñо обâÑкÑWeakRefбÑло видалено збиÑаÑем ÑмÑÑÑÑ), ÑÑнкÑÑÑfetchImgзаванÑажÑÑ Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð¾Ð²Ð¾. - РозмÑÑÑÑмо заванÑажене зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð² ÐºÐµÑ Ñ Ð²Ð¸Ð³Ð»ÑдÑ
WeakRefобâÑкÑа.
Ð¢ÐµÐ¿ÐµÑ Ñ Ð½Ð°Ñ Ñ ÐºÐ¾Ð»ÐµÐºÑÑÑ Map, в ÑкÑй клÑÑÑ â Ñе Ñмена зобÑÐ°Ð¶ÐµÐ½Ñ Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ ÑÑдкÑв, а знаÑÐµÐ½Ð½Ñ â Ñе обâÑкÑи WeakRef, Ñо мÑÑÑÑÑÑ ÑÐ°Ð¼Ñ Ð·Ð¾Ð±ÑаженнÑ.
Ð¦Ñ ÑÐµÑ Ð½Ñка Ð´Ð¾Ð¿Ð¾Ð¼Ð°Ð³Ð°Ñ ÑникнÑÑи видÑÐ»ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ обâÑÐ¼Ñ Ð¿Ð°Ð¼âÑÑÑ Ð½Ð° ÑеÑÑÑÑомÑÑÑÐºÑ Ð¾Ð±âÑкÑи, ÑÐºÑ Ð±ÑлÑÑе нÑÑ Ñо не викоÑиÑÑовÑÑ. Також вона заоÑаджÑÑ Ð¿Ð°Ð¼âÑÑÑ Ñа ÑÐ°Ñ Ñ ÑÐ°Ð·Ñ Ð¿Ð¾Ð²ÑоÑного викоÑиÑÑÐ°Ð½Ð½Ñ ÐºÐµÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±âÑкÑÑв.
ÐÑÑ Ð²ÑзÑалÑне вÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ñого, Ñк виглÑÐ´Ð°Ñ Ñей код:
Ðднак, Ñ ÑÑÑÑ ÑеалÑзаÑÑÑ Ñ ÑÐ²Ð¾Ñ Ð½ÐµÐ´Ð¾Ð»Ñки: згодом Map бÑде заповнÑваÑиÑÑ ÑÑдками в ÑкоÑÑÑ ÐºÐ»ÑÑÑв, ÑÐºÑ Ð²ÐºÐ°Ð·ÑÑÑÑ Ð½Ð° WeakRef, Ñий обâÑкÑ-ÑеÑеÑÐµÐ½Ñ Ð²Ð¶Ðµ бÑв видалений збиÑаÑем ÑмÑÑÑÑ:
Ðдин Ð·Ñ ÑпоÑобÑв подолаÑи Ñей недолÑк â Ñе пеÑÑодиÑно пеÑевÑÑÑÑи ÐºÐµÑ Ñ Ð²Ð¸Ð´Ð°Ð»ÑÑи âмеÑÑвÑâ запиÑи. ÐнÑий ÑпоÑÑб â викоÑиÑÑовÑваÑи ÑÑналÑзаÑоÑи, з Ñкими ми ознайомимоÑÑ Ð´Ð°Ð»Ñ.
ÐÑиклад â2: заÑÑоÑÑÐ²Ð°Ð½Ð½Ñ WeakRef Ð´Ð»Ñ Ð²ÑдÑÑÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв DOM
Ще один ваÑÑÐ°Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ð½Ñ WeakRef â вÑдÑÑÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв DOM.
УÑвÑмо ÑиÑÑаÑÑÑ, коли бÑдÑ-Ñкий ÑÑоÑоннÑй код або бÑблÑоÑека пÑаÑÑÑÑÑ Ð· елеменÑами на наÑÑй ÑÑоÑÑнÑÑ Ð´Ð¾Ñи, доки вони ÑÑнÑÑÑÑ Ñ DOM. ÐапÑиклад, Ñе може бÑÑи ÑÑоÑÐ¾Ð½Ð½Ñ ÑÑилÑÑа Ð´Ð»Ñ Ð¼Ð¾Ð½ÑÑоÑÐ¸Ð½Ð³Ñ Ñа ÑповÑÑÐµÐ½Ñ Ð¿Ñо ÑÑан ÑиÑÑеми (Ñак званий âлогеÑâ â пÑогÑама, Ñка надÑÐ¸Ð»Ð°Ñ ÑнÑоÑмаÑÑÐ¹Ð½Ñ Ð¿Ð¾Ð²ÑдомленнÑ, Ñо називаÑÑÑÑÑ âлогамиâ).
ÐнÑеÑакÑивний пÑиклад:
const startMessagesBtn = document.querySelector('.start-messages'); // (1)
const closeWindowBtn = document.querySelector('.window__button'); // (2)
const windowElementRef = new WeakRef(document.querySelector(".window__body")); // (3)
startMessagesBtn.addEventListener('click', () => { // (4)
startMessages(windowElementRef);
startMessagesBtn.disabled = true;
});
closeWindowBtn.addEventListener('click', () => document.querySelector(".window__body").remove()); // (5)
const startMessages = (element) => {
const timerId = setInterval(() => { // (6)
if (element.deref()) { // (7)
const payload = document.createElement("p");
payload.textContent = `ÐовÑдомленнÑ: СÑаÑÑÑ ÑиÑÑеми OK: ${new Date().toLocaleTimeString()}`;
element.deref().append(payload);
} else { // (8)
alert("ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð±Ñло видалено."); // (9)
clearInterval(timerId);
}
}, 1000);
};.app {
display: flex;
flex-direction: column;
gap: 16px;
}
.start-messages {
width: fit-content;
}
.window {
width: 100%;
border: 2px solid #464154;
overflow: hidden;
}
.window__header {
position: sticky;
padding: 8px;
display: flex;
justify-content: space-between;
align-items: center;
background-color: #736e7e;
}
.window__title {
margin: 0;
font-size: 24px;
font-weight: 700;
color: white;
letter-spacing: 1px;
}
.window__button {
padding: 4px;
background: #4f495c;
outline: none;
border: 2px solid #464154;
color: white;
font-size: 16px;
cursor: pointer;
}
.window__body {
height: 250px;
padding: 16px;
overflow: scroll;
background-color: #736e7e33;
}<!DOCTYPE HTML>
<html lang="uk">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="index.css">
<title>WeakRef DOM ÐогеÑ</title>
</head>
<body>
<div class="app">
<button class="start-messages">ÐоÑаÑи вÑдпÑÐ°Ð²ÐºÑ Ð¿Ð¾Ð²ÑдомленÑ</button>
<div class="window">
<div class="window__header">
<p class="window__title">ÐовÑдомленнÑ:</p>
<button class="window__button">ÐакÑиÑи</button>
</div>
<div class="window__body">
ÐÐµÐ¼Ð°Ñ Ð¿Ð¾Ð²ÑдомленÑ.
</div>
</div>
</div>
<script type="module" src="index.js"></script>
</body>
</html>ÐÑи наÑиÑÐºÐ°Ð½Ð½Ñ Ð½Ð° ÐºÐ½Ð¾Ð¿ÐºÑ âÐоÑаÑи вÑдпÑÐ°Ð²ÐºÑ Ð¿Ð¾Ð²ÑдомленÑâ, Ñ Ñак Ð·Ð²Ð°Ð½Ð¾Ð¼Ñ âвÑÐºÐ½Ñ Ð²ÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð»Ð¾Ð³Ñвâ (ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð· клаÑом .window__body) поÑинаÑÑÑ Ð·âÑвлÑÑиÑÑ Ð½Ð°Ð¿Ð¸Ñи (логи).
Ðле, Ñк ÑÑлÑки Ñей ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð¸Ð´Ð°Ð»Ð¸ÑÑÑÑ Ð· DOM, Ð»Ð¾Ð³ÐµÑ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ пÑипиниÑи надÑилаÑи повÑдомленнÑ. Щоб вÑдÑвоÑиÑи Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¾Ð³Ð¾ елеменÑа, доÑÑаÑнÑо лиÑе наÑиÑнÑÑи на ÐºÐ½Ð¾Ð¿ÐºÑ âÐакÑиÑиâ Ñ Ð¿ÑÐ°Ð²Ð¾Ð¼Ñ Ð²ÐµÑÑ Ð½ÑÐ¾Ð¼Ñ ÐºÑÑÑ.
ÐÐ»Ñ Ñого, Ñоб нам не ÑÑкладнÑваÑи ÑобоÑÑ, Ñ Ð½Ðµ ÑповÑÑаÑи ÑÑоÑоннÑй код кожен Ñаз, коли Ð½Ð°Ñ DOM-ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð¾ÑÑÑпний, а коли â нÑ, доÑÑаÑнÑо бÑде ÑÑвоÑиÑи Ð´Ð»Ñ Ð½Ñого Ñлабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ WeakRef.
ÐÑÑÐ»Ñ Ñого Ñк ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð±Ñде видалено з DOM, Ð»Ð¾Ð³ÐµÑ Ñе побаÑиÑÑ Ñ Ð¿ÑипиниÑÑ Ð½Ð°Ð´ÑилаÑи повÑдомленнÑ.
Ð¢ÐµÐ¿ÐµÑ Ð´Ð°Ð²Ð°Ð¹Ñе ÑозглÑнемо виÑ
Ñдний код деÑалÑнÑÑе (вкладка index.js):
-
ÐÑÑимÑÑмо DOM-ÐµÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ âÐоÑаÑи вÑдпÑÐ°Ð²ÐºÑ Ð¿Ð¾Ð²ÑдомленÑâ.
-
ÐÑÑимÑÑмо DOM-ÐµÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ âÐакÑиÑиâ.
-
ÐÑÑимÑÑмо DOM-ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ñкна вÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð»Ð¾Ð³Ñв за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа
new WeakRef(). Таким Ñином змÑннаwindowElementRefзбеÑÑÐ³Ð°Ñ Ñлабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° DOM-елеменÑ. -
ÐодаÑмо обÑобник подÑй на ÐºÐ½Ð¾Ð¿ÐºÑ âÐоÑаÑи вÑдпÑÐ°Ð²ÐºÑ Ð¿Ð¾Ð²ÑдомленÑâ, Ñкий вÑдповÑÐ´Ð°Ñ Ð·Ð° запÑÑк логеÑа пÑи наÑиÑканнÑ.
-
ÐодаÑмо обÑобник подÑй на ÐºÐ½Ð¾Ð¿ÐºÑ âÐакÑиÑиâ, Ñкий вÑдповÑÐ´Ð°Ñ Ð·Ð° закÑиÑÑÑ Ð²Ñкна вÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð»Ð¾Ð³Ñв пÑи наÑиÑканнÑ.
-
Ðа допомогоÑ
setIntervalзапÑÑкаÑмо вÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ повÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ñ ÑекÑндÑ. -
ЯкÑо DOM-ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ñкна вÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð»Ð¾Ð³Ñв ÑÑе Ñе доÑÑÑпний Ñ Ð·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð² памâÑÑÑ, ÑÑвоÑÑÑмо Ñа вÑдпÑавлÑÑмо нове повÑдомленнÑ.
-
ЯкÑо меÑод
deref()повеÑÑаÑundefined, Ñе ознаÑаÑ, Ñо DOM-ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð±Ñло видалено з памâÑÑÑ. У ÑÐ°ÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð»Ð¾Ð³ÐµÑ Ð¿ÑипинÑÑ Ð¿Ð¾ÐºÐ°Ð· повÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ñ Ñ ÑÐºÐ¸Ð´Ð°Ñ ÑаймеÑ. -
alert, Ñкий бÑде викликано пÑÑÐ»Ñ Ñого, Ñк DOM-ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ñкна вÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð»Ð¾Ð³Ñв видалиÑÑÑÑ Ð· памâÑÑÑ (ÑобÑо пÑÑÐ»Ñ Ð½Ð°ÑиÑÐºÐ°Ð½Ð½Ñ Ð½Ð° ÐºÐ½Ð¾Ð¿ÐºÑ âÐакÑиÑиâ). ÐвеÑнÑÑÑ ÑвагÑ, Ñо Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð· памâÑÑÑ Ð¼Ð¾Ð¶Ðµ вÑдбÑÑиÑÑ Ð½Ðµ одÑазÑ, оÑкÑлÑки воно залежиÑÑ ÑÑлÑки вÑд внÑÑÑÑÑнÑÑ Ð¼ÐµÑ Ð°Ð½ÑзмÑв збиÑаÑа ÑмÑÑÑÑ.Ðи не можемо конÑÑолÑваÑи Ñей пÑоÑÐµÑ Ð±ÐµÐ·Ð¿Ð¾ÑеÑеднÑо з кодÑ. Ðле, незважаÑÑи на Ñе, Ñ Ð½Ð°Ñ Ð²Ñе Ñе Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²ÑÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñи пÑимÑÑовий збÑÑ ÑмÑÑÑÑ Ð· бÑаÑзеÑа.
У Google Chrome, напÑиклад, Ð´Ð»Ñ ÑÑого поÑÑÑбно вÑдкÑиÑи ÑнÑÑÑÑменÑи ÑозÑобника (Ctrl + Shift + J на Windows/Linux або Option + â + J на macOS), пеÑейÑи до вкладки âPerformanceâ Ñа наÑиÑнÑÑи на ÐºÐ½Ð¾Ð¿ÐºÑ Ð· ÑÐºÐ¾Ð½ÐºÐ¾Ñ ÑÑни â âCollect garbageâ:
Ðаний ÑÑнкÑÑонал пÑдÑÑимÑÑÑÑÑÑ Ñ Ð±ÑлÑÑоÑÑÑ ÑÑÑаÑÐ½Ð¸Ñ Ð±ÑаÑзеÑÑв. ÐÑÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð¸Ñ Ð´ÑйalertÑпÑаÑÑÑ Ð½ÐµÐ²Ñдкладно.
FinalizationRegistry
Ð ÑÐµÐ¿ÐµÑ Ð½Ð°ÑÑав ÑÐ°Ñ Ð¿Ð¾Ð³Ð¾Ð²Ð¾ÑиÑи пÑо ÑÑналÑзаÑоÑи. ÐеÑÑ Ð½Ñж ми пеÑейдемо далÑ, давайÑе ÑозбеÑемоÑÑ Ð· ÑеÑмÑнологÑÑÑ:
Ðолбек оÑиÑÐµÐ½Ð½Ñ (ÑÑналÑзаÑоÑ) â Ñе ÑÑнкÑÑÑ, Ñка виконÑÑÑÑÑÑ Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ, ÑкÑо обâÑкÑ, заÑеÑÑÑÑований в FinalizationRegistry, видалÑÑÑÑÑÑ Ð· памâÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ.
Ðого меÑа â надаÑи можливÑÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ð¸Ñ Ð¾Ð¿ÐµÑаÑÑй, повâÑÐ·Ð°Ð½Ð¸Ñ Ð· обâÑкÑом, пÑÑÐ»Ñ Ð¹Ð¾Ð³Ð¾ оÑÑаÑоÑного Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð· памâÑÑÑ.
Registry (або FinalizationRegistry) â Ñе ÑпеÑÑалÑний обâÑÐºÑ Ñ JavaScript, Ñкий кеÑÑÑ ÑеÑÑÑÑаÑÑÑÑ Ñа ÑкаÑÑваннÑм ÑеÑÑÑÑаÑÑÑ Ð¾Ð±âÑкÑÑв Ñа ÑÑ
колбекÑв оÑиÑеннÑ.
Цей Ð¼ÐµÑ Ð°Ð½Ñзм дозволÑÑ Ð·Ð°ÑеÑÑÑÑÑваÑи обâÑÐºÑ Ð´Ð»Ñ Ð²ÑдÑÑÐµÐ¶ÐµÐ½Ð½Ñ Ñ Ð¿Ð¾Ð²âÑзаÑи з ним колбек оÑиÑеннÑ. Ðо ÑÑÑÑ, Ñе ÑÑÑÑкÑÑÑа, Ñка збеÑÑÐ³Ð°Ñ ÑнÑоÑмаÑÑÑ Ð¿Ñо заÑеÑÑÑÑÐ¾Ð²Ð°Ð½Ñ Ð¾Ð±âÑкÑи Ñа ÑÑ ÐºÐ¾Ð»Ð±ÐµÐºÐ¸ оÑиÑеннÑ, а поÑÑм авÑомаÑиÑно Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ ÑÑ ÐºÐ¾Ð»Ð±ÐµÐºÐ¸ пÑи Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв з памâÑÑÑ.
ÐÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÐµÐºÐ·ÐµÐ¼Ð¿Ð»ÑÑа ÑеÑÑÑÑÑ FinalizationRegistry, необÑ
Ñдно викликаÑи його конÑÑÑÑкÑоÑ, Ñкий пÑÐ¸Ð¹Ð¼Ð°Ñ Ñдиний аÑгÑÐ¼ÐµÐ½Ñ â колбек оÑиÑÐµÐ½Ð½Ñ (ÑÑналÑзаÑоÑ).
СинÑакÑиÑ:
function cleanupCallback(heldValue) {
// код колбека оÑиÑеннÑ
}
const registry = new FinalizationRegistry(cleanupCallback);
ТÑÑ:
cleanupCallbackâ колбек оÑиÑеннÑ, Ñкий бÑде авÑомаÑиÑно викликаний пÑи Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°ÑеÑÑÑÑованого обâÑкÑа з памâÑÑÑ.heldValueâ знаÑеннÑ, Ñке пеÑедаÑÑÑÑÑ Ñк аÑгÑÐ¼ÐµÐ½Ñ Ð´Ð»Ñ ÐºÐ¾Ð»Ð±ÐµÐºÐ° оÑиÑеннÑ. ЯкÑоheldValueÑ Ð¾Ð±âÑкÑом, ÑеÑÑÑÑ Ð·Ð±ÐµÑÑÐ³Ð°Ñ Ð½Ð° нÑого ÑилÑне поÑиланнÑ.registryâ екземплÑÑFinalizationRegistry.
ÐеÑоди FinalizationRegistry:
-
register(target, heldValue [, unregisterToken])â викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ ÑеÑÑÑÑаÑÑÑ Ð¾Ð±âÑкÑÑв Ñ ÑеÑÑÑÑÑ.targetâ обâÑкÑ, Ñо ÑеÑÑÑÑÑÑÑÑÑÑ Ð´Ð»Ñ Ð²ÑдÑÑеженнÑ. ЯкÑоtargetбÑде видалено збиÑаÑем ÑмÑÑÑÑ, колбек оÑиÑÐµÐ½Ð½Ñ Ð±Ñде викликано з аÑгÑменÑомheldValue.ÐпÑÑоналÑний
unregisterTokenâ Ñокен ÑкаÑÑÐ²Ð°Ð½Ð½Ñ ÑеÑÑÑÑаÑÑÑ. Ðоже бÑÑи пеÑеданий Ð´Ð»Ñ ÑкаÑÑÐ²Ð°Ð½Ð½Ñ ÑеÑÑÑÑаÑÑÑ Ð´Ð¾ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑа збиÑаÑем ÑмÑÑÑÑ. ÐазвиÑай ÑкunregisterTokenвикоÑиÑÑовÑÑÑÑÑÑ Ð¾Ð±âÑкÑtarget, Ñо Ñ ÑÑандаÑÑÐ½Ð¾Ñ Ð¿ÑакÑикоÑ. -
unregister(unregisterToken)â меÑодunregisterвикоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ ÑкаÑÑÐ²Ð°Ð½Ð½Ñ ÑеÑÑÑÑаÑÑÑ Ð¾Ð±âÑкÑа в ÑеÑÑÑÑÑ. ÐÑн пÑÐ¸Ð¹Ð¼Ð°Ñ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ âunregisterToken(Ñокен ÑкаÑÑÐ²Ð°Ð½Ð½Ñ ÑеÑÑÑÑаÑÑÑ, Ñкий бÑв оÑÑиманий пÑд ÑÐ°Ñ ÑеÑÑÑÑаÑÑÑ Ð¾Ð±âÑкÑа).
Ð¢ÐµÐ¿ÐµÑ Ð¿ÐµÑейдемо до пÑоÑÑого пÑикладÑ. СкоÑиÑÑаÑмоÑÑ Ð²Ð¶Ðµ вÑдомим нам обâÑкÑом user Ñ ÑÑвоÑимо екземплÑÑ FinalizationRegistry:
let user = { name: "John" };
const registry = new FinalizationRegistry((heldValue) => {
console.log(`${heldValue} бÑв видалений збиÑаÑем ÑмÑÑÑÑ.`);
});
ÐоÑÑм заÑеÑÑÑÑÑÑмо обâÑкÑ, Ð´Ð»Ñ Ñкого поÑÑÑбен колбек оÑиÑеннÑ, викликавÑи меÑод register:
registry.register(user, user.name);
РеÑÑÑÑ Ð½Ðµ збеÑÑÐ³Ð°Ñ ÑилÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° обâÑкÑ, Ñо ÑеÑÑÑÑÑÑÑÑÑÑ, оÑкÑлÑки Ñе б ÑÑпеÑеÑило його пÑизнаÑеннÑ. Якби ÑеÑÑÑÑ Ð·Ð±ÐµÑÑгав ÑилÑне поÑиланнÑ, Ñо обâÑÐºÑ Ð½Ñколи б не бÑв видалений збиÑаÑем ÑмÑÑÑÑ.
ЯкÑо ж обâÑÐºÑ Ð²Ð¸Ð´Ð°Ð»ÑÑÑÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ, Ð½Ð°Ñ ÐºÐ¾Ð»Ð±ÐµÐº оÑиÑÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бÑÑи викликаний в ÑкийÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ñ Ð¼Ð°Ð¹Ð±ÑÑнÑомÑ, з пеÑеданим Ð¹Ð¾Ð¼Ñ heldValue:
// Ðоли об'ÑÐºÑ user видалиÑÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ, Ñ ÐºÐ¾Ð½ÑÐ¾Ð»Ñ Ð±Ñде виведено повÑдомленнÑ:
"John бÑв видалений збиÑаÑем ÑмÑÑÑÑ."
Також ÑÑнÑÑÑÑ ÑиÑÑаÑÑÑ, коли навÑÑÑ Ñ ÑеалÑзаÑÑÑÑ , де викоÑиÑÑовÑÑÑÑÑÑ ÐºÐ¾Ð»Ð±ÐµÐº оÑиÑеннÑ, Ñ Ð¹Ð¼Ð¾Ð²ÑÑнÑÑÑÑ, Ñо вÑн не бÑде викликаний.
ÐапÑиклад:
- Ðоли пÑогÑама повнÑÑÑÑ Ð·Ð°Ð²ÐµÑÑÑÑ ÑÐ²Ð¾Ñ ÑобоÑÑ (напÑиклад, пÑд ÑÐ°Ñ Ð·Ð°ÐºÑиÑÑÑ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸ в бÑаÑзеÑÑ).
- Ðоли Ñам екземплÑÑ
FinalizationRegistryбÑлÑÑе не доÑÑÑпний Ð´Ð»Ñ JavaScript кодÑ. ЯкÑо обâÑкÑ, Ñо ÑÑвоÑÑÑ ÐµÐºÐ·ÐµÐ¼Ð¿Ð»ÑÑFinalizationRegistry, Ð²Ð¸Ñ Ð¾Ð´Ð¸ÑÑ Ð· облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð°Ð±Ð¾ видалÑÑÑÑÑÑ, Ñо колбеки оÑиÑеннÑ, заÑеÑÑÑÑÐ¾Ð²Ð°Ð½Ñ Ð² ÑÑÐ¾Ð¼Ñ ÑеÑÑÑÑÑ, Ñакож можÑÑÑ Ð±ÑÑи не викликанÑ.
ÐеÑÑÐ²Ð°Ð½Ð½Ñ Ñ FinalizationRegistry
ÐовеÑÑаÑÑиÑÑ Ð´Ð¾ наÑого пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ñлабкого кеÑÑ, ми можемо помÑÑиÑи наÑÑÑпне:
- ÐезважаÑÑи на Ñе, Ñо знаÑеннÑ, обгоÑнÑÑÑ Ñ
WeakRef, бÑли зÑбÑÐ°Ð½Ñ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ, вÑе Ñе акÑÑалÑна пÑоблема âвиÑÐ¾ÐºÑ Ð¿Ð°Ð¼âÑÑÑâ Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ ÐºÐ»ÑÑÑв, Ñо залиÑилиÑÑ, знаÑÐµÐ½Ð½Ñ ÑÐºÐ¸Ñ Ð±Ñли зÑбÑÐ°Ð½Ñ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ.
ÐÑÑ Ð¿Ð¾ÐºÑаÑений пÑиклад кеÑÑваннÑ, Ñ ÑÐºÐ¾Ð¼Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ FinalizationRegistry:
function fetchImg() {
// абÑÑÑакÑна ÑÑнкÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±ÑаженÑ...
}
function weakRefCache(fetchImg) {
const imgCache = new Map();
const registry = new FinalizationRegistry((imgName) => { // (1)
const cachedImg = imgCache.get(imgName);
if (cachedImg && !cachedImg.deref()) imgCache.delete(imgName);
});
return (imgName) => {
const cachedImg = imgCache.get(imgName);
if (cachedImg?.deref()) {
return cachedImg?.deref();
}
const newImg = fetchImg(imgName);
imgCache.set(imgName, new WeakRef(newImg));
registry.register(newImg, imgName); // (2)
return newImg;
};
}
const getCachedImg = weakRefCache(fetchImg);
-
ÐÐ»Ñ ÐºÐµÑÑÐ²Ð°Ð½Ð½Ñ Ð¾ÑиÑеннÑм âмеÑÑÐ²Ð¸Ñ â запиÑÑв Ñ ÐºÐµÑÑ, коли повâÑÐ·Ð°Ð½Ñ Ð· ними обâÑкÑи
WeakRefзбиÑаÑÑÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ, ÑÑвоÑÑÑмо ÑеÑÑÑÑ Ð¾ÑиÑеннÑFinalizationRegistry.Ðажливим моменÑом ÑÑÑ Ñ Ñе, Ñо в ÐºÐ¾Ð»Ð±ÐµÐºÑ Ð¾ÑиÑÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ пеÑевÑÑÑÑиÑÑ, Ñи бÑв Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð¸Ð¹ збиÑаÑем ÑмÑÑÑÑ Ñ Ñи не бÑв доданий заново, Ñоб не видалиÑи âживийâ запиÑ.
-
ÐÑÑÐ»Ñ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ знаÑÐµÐ½Ð½Ñ (зобÑаженнÑ) в кеÑ, ÑеÑÑÑÑÑÑмо його в ÑеÑÑÑÑÑ ÑÑналÑзаÑоÑа Ð´Ð»Ñ Ð²ÑдÑÑÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑа
WeakRef.
Ð¦Ñ ÑеалÑзаÑÑÑ Ð¼ÑÑÑиÑÑ ÑÑлÑки акÑÑалÑÐ½Ñ Ð°Ð±Ð¾ âживÑâ паÑи клÑÑ/знаÑеннÑ.
У ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÐºÐ¾Ð¶ÐµÐ½ обâÑÐºÑ WeakRef заÑеÑÑÑÑований Ñ FinalizationRegistry.
РпÑÑÐ»Ñ Ñого, Ñк обâÑкÑи бÑдÑÑÑ Ð¾ÑиÑÐµÐ½Ñ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ, колбек оÑиÑÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»Ð¸ÑÑ Ð²ÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ undefined.
ÐÑÑ Ð²ÑзÑалÑне вÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾Ð³Ð¾ кодÑ:
ÐлÑÑовим аÑпекÑом в оновленÑй ÑеалÑзаÑÑÑ Ñ Ñе, Ñо ÑÑналÑзаÑоÑи даÑÑÑ Ð·Ð¼Ð¾Ð³Ñ ÑÑвоÑÑваÑи паÑалелÑÐ½Ñ Ð¿ÑоÑеÑи мÑж âоÑновноÑâ пÑогÑÐ°Ð¼Ð¾Ñ Ñа колбеками оÑиÑеннÑ. У конÑекÑÑÑ JavaScript, âоÑновнаâ пÑогÑама â Ñе Ð½Ð°Ñ JavaScript-код, Ñкий запÑÑкаÑÑÑÑÑ Ñ Ð²Ð¸ÐºÐ¾Ð½ÑÑÑÑÑÑ Ð² наÑÐ¾Ð¼Ñ Ð·Ð°ÑÑоÑÑÐ½ÐºÑ Ð°Ð±Ð¾ на вебÑÑоÑÑнÑÑ.
ÐÑже, з моменÑÑ, коли обâÑÐºÑ Ð¿Ð¾Ð·Ð½Ð°ÑаÑÑÑÑÑ Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ, до ÑакÑиÑного Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð»Ð±ÐµÐºÐ° оÑиÑеннÑ, може виникнÑÑи певний пÑомÑжок ÑаÑÑ. Ðажливо ÑозÑмÑÑи, Ñо в ÑÑÐ¾Ð¼Ñ ÑаÑÐ¾Ð²Ð¾Ð¼Ñ ÑнÑеÑÐ²Ð°Ð»Ñ Ð¾Ñновна пÑогÑама може внеÑÑи бÑдÑ-ÑÐºÑ Ð·Ð¼Ñни в обâÑÐºÑ Ð°Ð±Ð¾ навÑÑÑ Ð¿Ð¾Ð²ÐµÑнÑÑи його назад Ñ Ð¿Ð°Ð¼âÑÑÑ.
Ð¢Ð¾Ð¼Ñ Ð² ÐºÐ¾Ð»Ð±ÐµÐºÑ Ð¾ÑиÑÐµÐ½Ð½Ñ Ð¼Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð¿ÐµÑевÑÑиÑи, Ñи не бÑло Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾Ð´Ð°Ð½Ð¾ назад Ñ ÐºÐµÑ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ñ Ð¿ÑогÑамоÑ, Ñоб ÑникнÑÑи Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ âÐ¶Ð¸Ð²Ð¸Ñ â запиÑÑв. ÐналогÑÑно, пÑд ÑÐ°Ñ Ð¿Ð¾ÑÑÐºÑ ÐºÐ»ÑÑа в кеÑÑ ÑÑнÑÑ Ð¹Ð¼Ð¾Ð²ÑÑнÑÑÑÑ Ñого, Ñо знаÑÐµÐ½Ð½Ñ Ð±Ñло видалено збиÑаÑем ÑмÑÑÑÑ, але колбек оÑиÑÐµÐ½Ð½Ñ Ñе не бÑло виконано.
Ð¢Ð°ÐºÑ ÑиÑÑаÑÑÑ Ð¿Ð¾ÑÑебÑÑÑÑ Ð¾ÑÐ¾Ð±Ð»Ð¸Ð²Ð¾Ñ Ñваги, ÑкÑо ви пÑаÑÑÑÑе з FinalizationRegistry.
ÐикоÑиÑÑÐ°Ð½Ð½Ñ WeakRef Ñ FinalizationRegistry на пÑакÑиÑÑ
ÐеÑÐµÑ Ð¾Ð´ÑÑи вÑд ÑеоÑÑÑ Ð´Ð¾ пÑакÑики, ÑÑвÑÑÑ ÑÐ¾Ð±Ñ ÑеалÑний ÑÑенаÑÑй, коли коÑиÑÑÑÐ²Ð°Ñ ÑÐ¸Ð½Ñ ÑонÑзÑÑ ÑÐ²Ð¾Ñ ÑоÑогÑаÑÑÑ Ð½Ð° мобÑлÑÐ½Ð¾Ð¼Ñ Ð¿ÑиÑÑÑÐ¾Ñ Ð· ÑкимоÑÑ Ñ Ð¼Ð°Ñним ÑеÑвÑÑом (Ñк-Ð¾Ñ iCloud або Google Photos), Ñ Ñ Ð¾Ñе пеÑеглÑдаÑи ÑÑ Ð· ÑнÑÐ¸Ñ Ð¿ÑиÑÑÑоÑв. ÐодÑÐ±Ð½Ñ ÑеÑвÑÑи кÑÑм оÑновного ÑÑнкÑÑÐ¾Ð½Ð°Ð»Ñ Ð¿ÐµÑеглÑÐ´Ñ ÑоÑогÑаÑÑй, пÑопонÑÑÑÑ Ð¼Ð°ÑÑ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ð¸Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑей, напÑиклад:
- РедагÑÐ²Ð°Ð½Ð½Ñ ÑоÑогÑаÑÑй Ñа вÑдео еÑекÑи.
- СÑвоÑÐµÐ½Ð½Ñ âÑпогадÑвâ Ñа алÑбомÑв.
- ÐонÑаж вÑдео з ÑеÑÑÑ ÑоÑогÑаÑÑй.
- â¦Ñ багаÑо ÑнÑого.
Як пÑиклад ÑÑÑ Ð¼Ð¸ викоÑиÑÑовÑваÑимемо доÑиÑÑ Ð¿ÑимÑÑÐ¸Ð²Ð½Ñ ÑеалÑзаÑÑÑ Ñакого ÑеÑвÑÑÑ.
ÐÑновна ÑÑÑÑ â показаÑи можливий ÑÑенаÑÑй ÑпÑлÑного викоÑиÑÑÐ°Ð½Ð½Ñ WeakRef Ñ FinalizationRegistry в ÑеалÑÐ½Ð¾Ð¼Ñ Ð¶Ð¸ÑÑÑ.
ÐÑÑ Ñк Ñе виглÑдаÑ:
ÐÑвоÑÑÑ Ð·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ñ Ð¼Ð°Ñна бÑблÑоÑека ÑоÑогÑаÑÑй (вони вÑдобÑажаÑÑÑÑÑ Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ Ð¼ÑнÑаÑÑÑ). Ðи можемо вибÑаÑи поÑÑÑÐ±Ð½Ñ Ð½Ð°Ð¼ зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ñ ÑÑвоÑиÑи колаж, наÑиÑнÑвÑи на ÐºÐ½Ð¾Ð¿ÐºÑ "Create collage" Ñ Ð¿ÑавÑй ÑаÑÑÐ¸Ð½Ñ ÑÑоÑÑнки. ÐоÑÑм, оÑÑиманий ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð° бÑде заванÑажиÑи Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ Ð·Ð¾Ð±ÑаженнÑ.
ÐÐ»Ñ Ð·Ð±ÑлÑÑÐµÐ½Ð½Ñ ÑвидкоÑÑÑ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑÑоÑÑнки ÑозÑмно бÑде заванÑажÑваÑи Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваÑи мÑнÑаÑÑÑи ÑоÑогÑаÑÑй Ñаме в ÑÑиÑлÑй ÑкоÑÑÑ. Ðле, Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÐºÐ¾Ð»Ð°Ð¶Ñ Ð· обÑÐ°Ð½Ð¸Ñ ÑоÑогÑаÑÑй, заванÑажÑваÑи Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи ÑÑ Ñ Ð¿Ð¾Ð²Ð½Ð¾ÑозмÑÑнÑй ÑкоÑÑÑ.
ÐижÑе ми баÑимо, Ñо внÑÑÑÑÑнÑй ÑозмÑÑ Ð¼ÑнÑаÑÑÑ ÑÑановиÑÑ 240Ã240 пÑкÑелÑв. РозмÑÑ Ð±Ñв обÑаний ÑпеÑÑалÑно Ð´Ð»Ñ Ð·Ð±ÑлÑÑÐµÐ½Ð½Ñ ÑвидкоÑÑÑ Ð·Ð°Ð²Ð°Ð½ÑаженнÑ. ÐÑÑм Ñого, нам не поÑÑÑÐ±Ð½Ñ Ð¿Ð¾Ð²Ð½Ð¾ÑозмÑÑÐ½Ñ ÑоÑогÑаÑÑÑ Ð² ÑÐµÐ¶Ð¸Ð¼Ñ Ð¿Ð¾Ð¿ÐµÑеднÑого пеÑеглÑдÑ.
ÐÑипÑÑÑимо, Ñо нам поÑÑÑбно ÑÑвоÑиÑи колаж Ñз 4 ÑоÑогÑаÑÑй: ми вибиÑаÑмо ÑÑ , пÑÑÐ»Ñ Ñого наÑиÑкаÑмо ÐºÐ½Ð¾Ð¿ÐºÑ "Create collage". Ðа ÑÑÐ¾Ð¼Ñ ÐµÑÐ°Ð¿Ñ Ð²Ð¶Ðµ вÑдома нам ÑÑнкÑÑÑ
weakRefCache пеÑевÑÑÑÑ, Ñи Ñ Ð¿Ð¾ÑÑÑбне зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð² кеÑÑ.
ЯкÑо нÑ, Ñо заванÑажÑÑ Ð¹Ð¾Ð³Ð¾ з Ñ
маÑи Ñ ÑозмÑÑÑÑ Ð² ÐºÐµÑ Ð´Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑÑ Ð¿Ð¾Ð´Ð°Ð»ÑÑого викоÑиÑÑаннÑ.
Ð Ñак вÑдбÑваÑÑÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ обÑаного зобÑаженнÑ:
ÐвеÑнÑвÑи ÑÐ²Ð°Ð³Ñ Ñо показÑÑ ÐºÐ¾Ð½ÑолÑ, можна побаÑиÑи, ÑÐºÑ Ð· ÑоÑогÑаÑÑй бÑли заванÑÐ°Ð¶ÐµÐ½Ñ Ð· Ñ Ð¼Ð°Ñи â на Ñе вказÑÑ FETCHED_IMAGE. ÐÑкÑлÑки Ñе пеÑÑа ÑпÑоба ÑÑвоÑÐµÐ½Ð½Ñ ÐºÐ¾Ð»Ð°Ð¶Ñ, Ñе ознаÑаÑ, Ñо на Ð´Ð°Ð½Ð¾Ð¼Ñ ÐµÑÐ°Ð¿Ñ âÑлабкий кеÑâ Ñе бÑв поÑожнÑй, а вÑÑ ÑоÑогÑаÑÑÑ Ð±Ñли заванÑÐ°Ð¶ÐµÐ½Ñ Ð· Ñ Ð¼Ð°Ñи Ñ ÑозмÑÑÐµÐ½Ñ Ð² нÑого.
Ðле, поÑÑд Ñз пÑоÑеÑом заванÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±ÑаженÑ, вÑдбÑваÑÑÑÑÑ Ñе й пÑоÑÐµÑ Ð¾ÑиÑÐµÐ½Ð½Ñ Ð¿Ð°Ð¼âÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ. Це ознаÑаÑ, Ñо обâÑкÑ, Ñкий збеÑÑгаÑÑÑÑÑ Ð² кеÑÑ Ñ Ð½Ð° Ñкий ми поÑилаÑмоÑÑ, викоÑиÑÑовÑÑÑи Ñлабке поÑиланнÑ, видалÑÑÑÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ. Ð Ð½Ð°Ñ ÑÑналÑзаÑÐ¾Ñ Ð²Ð¸ÐºÐ¾Ð½ÑÑÑÑÑÑ ÑÑпÑÑно, Ñим Ñамим видалÑÑÑи клÑÑ, за Ñким зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð·Ð±ÐµÑÑгалоÑÑ Ð² кеÑÑ. ÐÑо Ñе Ð½Ð°Ñ Ð¿Ð¾Ð²ÑдомлÑÑ CLEANED_IMAGE:
ÐÐ°Ð»Ñ Ð¼Ð¸ ÑозÑмÑÑмо, Ñо нам не подобаÑÑÑÑÑ Ð¾ÑÑиманий колаж, Ñ Ð²Ð¸ÑÑÑÑÑмо змÑниÑи одне Ñз зобÑÐ°Ð¶ÐµÐ½Ñ Ñ ÑÑвоÑиÑи новий. ÐÐ»Ñ ÑÑого доÑÑаÑнÑо пÑибÑаÑи видÑÐ»ÐµÐ½Ð½Ñ Ð· непоÑÑÑбного зобÑаженнÑ, вибÑаÑи ÑнÑе, Ñа Ñе Ñаз наÑиÑнÑÑи на ÐºÐ½Ð¾Ð¿ÐºÑ "Create collage":
Ðле, ÑÑого ÑÐ°Ð·Ñ Ð½Ðµ вÑÑ Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð±Ñли викаÑÐ°Ð½Ñ Ð· меÑежÑ, Ñ Ð¾Ð´Ð½Ðµ з Ð½Ð¸Ñ Ð±Ñло взÑÑе Ð·Ñ Ñлабкого кеÑÑ: пÑо Ñе нам говоÑиÑÑ Ð¿Ð¾Ð²ÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ CACHED_IMAGE. Це ознаÑаÑ, Ñо на Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÐºÐ¾Ð»Ð°Ð¶Ñ Ð·Ð±Ð¸ÑÐ°Ñ ÑмÑÑÑÑ Ñе не видалив наÑе зобÑаженнÑ, Ñ Ð¼Ð¸ ÑмÑливо взÑли його з кеÑа, Ñим Ñамим ÑкоÑоÑивÑи кÑлÑкÑÑÑÑ Ð¼ÐµÑÐµÐ¶ÐµÐ²Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑв Ñ Ð¿ÑиÑкоÑивÑи загалÑний ÑÐ°Ñ Ð¿ÑоÑеÑÑ ÑÑвоÑÐµÐ½Ð½Ñ ÐºÐ¾Ð»Ð°Ð¶Ñ:
ÐавайÑе Ñе ÑÑÐ¾Ñ Ð¸ "погÑаÑмо", замÑнивÑи одне Ñз зобÑÐ°Ð¶ÐµÐ½Ñ Ñе Ñаз Ñ ÑÑвоÑивÑи новий колаж:
ЦÑого ÑÐ°Ð·Ñ ÑезÑлÑÑÐ°Ñ Ñе бÑлÑÑ Ð·Ð½Ð°Ñний. Ð 4-ÑÐ¾Ñ Ð¾Ð±ÑÐ°Ð½Ð¸Ñ Ð·Ð¾Ð±ÑаженÑ, 3-Ñи з Ð½Ð¸Ñ Ð±Ñли взÑÑÑ Ð·Ñ Ñлабкого кеÑÑ, Ñ ÑÑлÑки одне довелоÑÑ Ð·Ð°Ð²Ð°Ð½ÑажиÑи з меÑежÑ. ÐÐ½Ð¸Ð¶ÐµÐ½Ð½Ñ Ð½Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° меÑÐµÐ¶Ñ Ñклало близÑко 75%. ÐÑажаÑ, Ñи не Ñак?
ÐвÑÑно, не ÑлÑд забÑваÑи, Ñо Ñака поведÑнка не Ñ Ð³Ð°ÑанÑованоÑ, Ñ Ð·Ð°Ð»ÐµÐ¶Ð¸ÑÑ Ð²Ñд конкÑеÑÐ½Ð¾Ñ ÑеалÑзаÑÑÑ Ñа ÑобоÑи збиÑаÑа ÑмÑÑÑÑ.
ÐиÑ
одÑÑи з ÑÑого, одÑÐ°Ð·Ñ Ð¶ Ð²Ð¸Ð½Ð¸ÐºÐ°Ñ ÑÑлком логÑÑне запиÑаннÑ: ÑÐ¾Ð¼Ñ Ð± нам не викоÑиÑÑаÑи звиÑайний кеÑ, де ми можемо ÑÐ°Ð¼Ñ ÐºÐµÑÑваÑи його вмÑÑÑом, а не покладаÑиÑÑ Ð½Ð° збиÑÐ°Ñ ÑмÑÑÑÑ?
ÐÑе вÑÑно, Ñ Ð±ÑлÑÑоÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв Ð½ÐµÐ¼Ð°Ñ Ð½ÐµÐ¾Ð±Ñ
ÑдноÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи WeakRef Ñ FinalizationRegistry.
ТÑÑ Ð¼Ð¸ пÑоÑÑо пÑодемонÑÑÑÑвали алÑÑеÑнаÑÐ¸Ð²Ð½Ñ ÑеалÑзаÑÑÑ Ð¿Ð¾Ð´Ñбного ÑÑнкÑÑоналÑ, викоÑиÑÑовÑÑÑи неÑÑивÑалÑний пÑÐ´Ñ Ñд Ñз ÑÑкавими оÑобливоÑÑÑми мови. Тим не менÑ, ми не можемо покладаÑиÑÑ Ð½Ð° Ñей пÑиклад, ÑкÑо нам Ð½ÐµÐ¾Ð±Ñ Ñдний поÑÑÑйний Ñ Ð¿ÐµÑедбаÑÑваний ÑезÑлÑÑаÑ.
Ðи можеÑе вÑдкÑиÑи Ñей пÑиклад Ñ Ð¿ÑÑоÑниÑÑ.
ÐÑдÑÑмки
WeakRef â пÑизнаÑений Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÑлабкиÑ
поÑÐ¸Ð»Ð°Ð½Ñ Ð½Ð° обâÑкÑи, Ñо дозволÑÑ Ñм бÑÑи видаленими з памâÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ, ÑкÑо на ниÑ
бÑлÑÑе Ð½ÐµÐ¼Ð°Ñ ÑилÑниÑ
поÑиланÑ.
Це коÑиÑно Ð´Ð»Ñ ÑозвâÑÐ·Ð°Ð½Ð½Ñ Ð¿Ñоблеми надмÑÑного викоÑиÑÑÐ°Ð½Ð½Ñ Ð¿Ð°Ð¼âÑÑÑ Ñа опÑимÑзаÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ð½Ñ ÑиÑÑемниÑ
ÑеÑÑÑÑÑв Ñ Ð·Ð°ÑÑоÑÑнкаÑ
.
FinalizationRegistry â Ñе заÑÑб ÑеÑÑÑÑаÑÑÑ ÐºÐ¾Ð»Ð±ÐµÐºÑв, ÑÐºÑ Ð²Ð¸ÐºÐ¾Ð½ÑÑÑÑÑÑ Ð¿Ñд ÑÐ°Ñ Ð·Ð½Ð¸ÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв, на ÑÐºÑ Ð±ÑлÑÑе Ð½ÐµÐ¼Ð°Ñ ÑилÑниÑ
поÑиланÑ.
Це Ð´Ð°Ñ Ð·Ð¼Ð¾Ð³Ñ Ð·Ð²ÑлÑнÑÑи повâÑÐ·Ð°Ð½Ñ Ð· обâÑкÑом ÑеÑÑÑÑи або виконÑваÑи ÑнÑÑ Ð½ÐµÐ¾Ð±Ñ
ÑÐ´Ð½Ñ Ð¾Ð¿ÐµÑаÑÑÑ Ð¿ÐµÑед видаленнÑм обâÑкÑа з памâÑÑÑ.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)