مقدمهای بر 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
، آن به جمعآوری زباله واجد شرایط میشود.