Ð ÑÑой ÑÑаÑÑе ÑаÑÑмаÑÑиваеÑÑÑ Ð¾ÑÐµÐ½Ñ ÑзконапÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñема, Ñ ÐºÐ¾ÑоÑой болÑÑинÑÑво ÑазÑабоÑÑиков на пÑакÑике ÑÑалкиваÑÑÑÑ ÑÑезвÑÑайно Ñедко (а могÑÑ Ð¸ вообÑе не знаÑÑ Ð¾ ÐµÑ ÑÑÑеÑÑвовании).
ÐÑ ÑекомендÑем пÑопÑÑÑиÑÑ ÑÑÑ Ð³Ð»Ð°Ð²Ñ, еÑли Ð²Ñ ÑолÑко наÑали изÑÑение 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>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="index.css">
</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, ÑдалÑеÑÑÑ Ð¸Ð· памÑÑи ÑбоÑÑиком мÑÑоÑа.
Ðго ÑÐµÐ»Ñ â пÑедоÑÑавиÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¾Ð¿ÐµÑаÑий, ÑвÑзаннÑÑ Ñ Ð¾Ð±ÑекÑом, поÑле его оконÑаÑелÑного ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· памÑÑи.
РееÑÑÑ (или 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â¦)