کلوژر کلوژر که میگن چیه؟؟؟

Javascript Closures
Javascript Closures


همه چیز برمیگرده به حوزه دید متغیر ها در جاوا اسکریپت

به صورت خلاصه در جاوا اسکریپت دو نوع متغیر Private و Global داریم:

متغیر های Global در ابتدای اجرای برنامه ساخته میشه و سر تا سر برنامه قابل دسترسی و تغییر هستن و همچنین تا زمانی که پنجره مرورگر بسته نشه در حافظه باقی میمونن و فضا اشغال میکنن
متغیر های Private داخل هر اسکوپ تعریف میشه و با پایان همان اسکوپ، از بین میرن


فرض کنید میخوایم یک برنامه رزرو بنویسیم و نیاز به یک تابعی داریم که نوبت های رزرو شده رو حساب کنه برای این کار کد زیر رو مینویسیم

function reservation() {
    let counter = 0
    counter++
    return counter
}
console.log(reservation());
// 1
console.log(reservation());
// 1
console.log(reservation());
// 1

این که هر دفعه 1 رو برمیگردونه :( مثل اینکه یک جای کار میلنگه


طبق مدیریت حافظه در جاوااسکریپت میدونیم که " متغیر های Private داخل هر اسکوپ تعریف میشه و با پایان همان اسکوپ، از بین میرن "

خب بزار دوباره امتحان کنیم

let counter = 0
function reservation() {
    counter++
    return counter
}
console.log(reservation()); 
// 1
console.log(reservation());
 // 2 
console.log(reservation());
 // 3

خبببببب جواب داد، با تعریف متغیر عمومی همه چیز درست شد و طبق قانون نانوشته برنامه نویس ها " اگه کار میکنه بهش دست نزن " کارمون به پایان رسید.

اما بعداز چند وقت میخوایم برنامه رو توسعه بدیم و یک تابع دیگه بنویسیم که تعداد کنسلی ها رو هم نشون بده این تابع هم نیاز به شمارنده داره این که کاری نداره با یک متغیر عمومی جدید حلش میکنیم . اما این کار میتونه یکسری مشکل به وجود بیاره مثلا

  • اگر این متغیر های عمومی از نوع var باشن که میتونن بدون هیچ اروری چندبار تعریف بشن و کل کارکرد برنامه بهم بریزه
  • اگر از let استفاده کنیم باعث Memory Leaks و هدر رفتن حافظه میشه

یکی از راه حل هایی که متغیر هامون ثبات و امنیت بیشتری دارن استفاده از کلوژر هستش پس بریم بنویسیمش

اساس کار closure اینه که میتونیم یک متغیر داخل تابع بسازیم که بعد از هربار اجرا شدن Garbage collection این متغیر از بین نمیره

function reservation() {
    let counter = 0;
    return function () {
        counter++;
        return counter;
    };
}
let reservationCount = reservation();
console.log(reservationCount());  // 1
console.log(reservationCount());  // 2
console.log(reservationCount());  // 3

با این روش مشکلمون حل میشه و در نهایت یک متغیری ساختیم که ثبات و امنیت بیشتری داره و برناممون قابل توسعه تر میشه