بروزرسانی 1401/1/21
در جاوا اسکریپت هم مثل هر زبان دیگه ای به هر متغیری که تعریف میشه مقداری حافظه اختصاص داده میشه. این حافظه به صورت اتوماتیک توسط Garbage collection مدیریت میشه.
در جاوا اسکریپت Garbage collection توسط دو الگوریتم حافظه رو مدیریت میکنه
الگوریتم Reference-counting متغیر هایی که هیچ رفرنسی به آن ها در حافظه نداره را پیدا و از حافظه پاک میکنه.
در مثال زیر پس از تغییر مقدار user ، دیگر به آبجکت {name:"Ali khoshgoftar"} هیچ رفرنسی داده نشده در نتیجه Garbage collection مقدار {name:"Ali khoshgoftar"} را از حافظه حذف میکند.
let user={name:"Ali khoshgoftar"} user=null //Garbage collector deleting the {name:"Ali khoshgoftar"}
الگوریتم Mark-and-sweep هر شی ای که به آن دسترسی وجود نداشته باشد از حافظه پاک میکند. این الگوریتم از متغیر های عمومی شروع به پیمایش کرده و تمام اشیا مختلفی که به آنها دسترسی وجود دارد را پیدا میکند پس از آن هر شی ای که به آن اشاره ای نشده بود از حافظه پاک میکند.
در مثال زیر زمانی که makeFunc صدا زده شود متغیر counter تعریف شده و مقدار 1 به آن تخصیص داده میشود و پس از return کردن مقدار Garbage collection این متغیر را از حافظه حذف میکند. پس از صدا زده شدن مجدد این تابع ، مجدد متغیر counter تعریف، مقدار دهی و در آخر حذف میشود.
function makeFunc() { let counter = 1; return ++counter; } console.log(makeFunc()) // 2 console.log(makeFunc()) // 2 console.log(makeFunc()) // 2
اگر بخواهیم طبق این الگوریتم یک متغیر بسازیم که پس از اجرا توسط Garbage collection این مقدار پاک نشود باید از کلوژر استفاده کنیم که در مقاله کلوژر کلوژر که میگن چیه؟ به صورت کامل در موردش صحبت کردیم