درک خطای "Key not weakly held" در جاوااسکریپت
خطای "Key not weakly held" در جاوااسکریپت معمولاً به دلایل مربوط به کش و مدیریت حافظه در مرورگرها بروز میکند. وقتی شما از WeakMap یا WeakSet استفاده میکنید، این خطا ممکن است به دلیل نگهداشتن مرجع به علت نادرست در ساختار دادههای شما ایجاد شود. بیایید ببینیم این خطا چه معنایی دارد و چه نحوۀ اصلاحی برای آن وجود دارد.
خلاصه اینکه، WeakMap اجازه میدهد تا کلیدها بهصورت ضعیف کنترل شوند، به این معنا که وقتی دیگر به کلید نیاز ندارید، امکان جمعآوری زباله به طور خودکار فراهم میشود. اگر کلیدی که سعی دارید در WeakMap نگهدارید، به عنوان ضعیف شناسایی نشود، با این خطا روبهرو خواهید شد.
برای مثال، فرض کنید شما در حال کار با WeakMap هستید و تلاش میکنید تا آبجکتهایی را به عنوان کلید ذخیره کنید. اگر این آبجکتها غیرقابل دسترسی شوند، شما این خطا را مشاهده خواهید کرد. این یک مساله رایج در کدنویسی است که باید به آن توجه کرد و آگاه باشید که چگونه از آن پیشگیری کنید.
در نهایت، برای حل این مشکل، باید اطمینان حاصل کنید که آبجکتهایی که به عنوان کلید وارد WeakMap میشوند، به نحو صحیح در برنامه تعریف شده باشند و ارتباط آنها با سایر عناصر به درستی نگهداری شود. اوپراتورهای مناسب را استفاده کنید و از این خطا به عنوان یک یادآور برای عادات صحیح در کدنویسی استفاده کنید.
نمونه کد
const weakMap = new WeakMap();
const obj1 = {};
const obj2 = {};
weakMap.set(obj1, "value1");
console.log(weakMap.get(obj1)); // value1
// If we lose the reference of obj1
// obj1 = null; // Uncommenting this line will allow garbage collection to remove obj1
توضیح خط به خط کد
const weakMap = new WeakMap();
در این خط، ما یک WeakMap جدید به نام weakMap ایجاد میکنیم که میتواند کلیدهای ضعیف را نگهداری کند.
const obj1 = {};
در این خط یک آبجکت خالی به نام obj1 تعریف میکنیم که به عنوان کلید در weakMap استفاده خواهد شد.
const obj2 = {};
در اینجا ما یک آبجکت دیگر به نام obj2 تعریف کردیم که فعلاً استفاده نمیشود، اما میتواند در آینده مفید باشد.
weakMap.set(obj1, "value1");
با این خط، ما obj1 را به عنوان کلید و "value1" را به عنوان مقداری که با آن مرتبط است، به weakMap اضافه میکنیم.
console.log(weakMap.get(obj1));
در اینجا ما مقدار ذخیره شده برای obj1 را در weakMap با استفاده از متد get چاپ میکنیم، که ترجیحاً "value1" است.
// obj1 = null;
اگر این خط را کامنتگذاری نکنید، در این حالت ما مرجع obj1 را از بین میبریم و این امکان را برای جمعآوری زباله فراهم میکنیم. در نتیجه، weakMap دیگر نمیتواند obj1 را نگهداری کند و این ممکن است به خطا منجر شود.