چگونه از FinalizationRegistry در جاوااسکریپت استفاده کنیم؟

javascript finalizationregistry usage guide
20 آبان 1403

مقدمه‌ای بر FinalizationRegistry

در جاوااسکریپت، زمانی که با اشیاء سر و کار داریم، ممکن است مدیریت منابع به چالشی تبدیل شود. زبان جاوااسکریپت به صورت ضمنی به جمع‌آوری زباله‌ها (Garbage Collection) کمک می‌کند، اما گاهی نیاز به الگوهای پیچیده‌تری برای مدیریت منابع داریم. یکی از این ابزارها FinalizationRegistry است که به مدیریت منابع اشیاء زمانی که جمع‌آوری می‌شوند، کمک می‌کند.

می‌توانیم FinalizationRegistry را به عنوان یک مشاهده‌گر برای جمع‌آوری زباله تصور کنیم. بدین صورت که به شما اجازه می‌دهد تا بتوانید عملکردهایی را دربارهٔ اشیاءی که در حال جمع‌آوری هستند، تعیین کنید. اما نباید این را با عملکردهایی که به صورت بلادرنگ (real-time) هستند، اشتباه بگیرید، چرا که گارانتی‌های زمانی در این روش وجود ندارد.

معرفی FinalizationRegistry

FinalizationRegistry شامل یک متد اصلی به نام register است. این متد به شما اجازه می‌دهد تا یک کال‌بک (callback) مشخص کنید که باید به هنگام جمع‌آوری زباله بر روی شیء خاصی اجرا شود. این عمل توانایی مدیریت منابع بیشتری را در اختیار توسعه‌دهندگان قرار می‌دهد.

وقتی به جمع‌آوری اشیاء فکر می‌کنیم، اغلب در ذهن ما این تصور ایجاد می‌شود که زمان بسیاری برای جمع‌آوری زباله وجود نخواهد داشت، اما FinalizationRegistry اجازه می‌دهد تریگرهایی برای جمع‌آوری اشیاء تعریف کنیم.

برای مثال، در مواقعی که نیاز داریم ارتباطاتی که دیگر استفاده نمی‌شوند یا حافظه‌هایی که به کاربر نشت کرده‌اند، آزاد شوند، از این ویژگی استفاده می‌کنیم. این ابزار بسیار قدرتمند است، به خصوص در سناریوهایی که نیاز به حداکثر بهره‌وری از منابع دارید.

مثالی از استفاده از FinalizationRegistry


        const registry = new FinalizationRegistry((heldValue) => {
console.log('Object finalized:', heldValue);
});

let myObj = {some: 'data'};
registry.register(myObj, 'myObject resource');

myObj = null; // Now eligible for garbage collection

شکافت کد نمونه

const registry = new FinalizationRegistry((heldValue) => {...})
یک نمونه FinalizationRegistry ایجاد می‌کند که کال‌بک آن برای شیء نهایی شده اجرا می‌شود.

let myObj = {some: 'data'}
یک شیء به نام myObj تعریف می‌شود.

registry.register(myObj, 'myObject resource')
این خط شیء myObj را در FinalizationRegistry ثبت می‌کند و رشته‌ای برای شناسایی منبع آن اضافه می‌کند.

myObj = null;
با تنظیم myObj به null، آن به جمع‌آوری زباله واجد شرایط می‌شود.

سوالات متداول

؟

چرا از FinalizationRegistry استفاده کنیم؟

؟

آیا FinalizationRegistry می‌تواند گارانتی زمانی برای فراخوانی کال‌بک فراهم کند؟

؟

آیا باید همیشه از FinalizationRegistry استفاده کنیم؟

؟

آیا FinalizationRegistry برای تمام مرورگرها قابل استفاده است؟