𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 𝗖𝗹𝗼𝘀𝘂𝗿𝗲𝘀 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱

آپ JavaScript میں روزانہ closures کا استعمال کرتے ہیں۔ غالباً آپ انہیں React hooks، event listeners، اور Node.js callbacks میں استعمال کرتے ہیں۔ بہت سے ڈویلپرز اس کے نظریے (theory) کو سمجھنے میں مشکل محسوس کرتے ہیں، لیکن ایک بار جب آپ پیٹرن دیکھ لیتے ہیں تو یہ تصور سادہ ہو جاتا ہے۔

closures کو سمجھنے کے لیے، آپ کو lexical scope کو سمجھنا ہوگا۔

Lexical scope کا مطلب ہے کہ ایک فنکشن اپنے خود کے scope اور کسی بھی بیرونی (outer) scope سے ویری ایبلز تک رسائی حاصل کر سکتا ہے جہاں اسے ڈیفائن کیا گیا تھا۔ اس کا انحصار اس بات پر ہے کہ آپ کوڈ کہاں لکھتے ہیں، نہ کہ اس پر کہ آپ اسے کہاں کال کرتے ہیں۔

Closure ایک ایسا فنکشن ہے جو اپنے اصل scope کے ویری ایبلز کو اس وقت بھی یاد رکھتا ہے جب وہ scope اپنا کام مکمل کر چکا ہو۔

ایک فنکشن کو ایک بیگ (backpack) لے کر چلنے والے کے طور پر سوچیں۔ جب فنکشن تخلیق کیا جاتا ہے، تو وہ اپنے ماحول (environment) سے ضرورت کے تمام ویری ایبلز اس بیگ میں پیک کر لیتا ہے۔ فنکشن وہ بیگ ہر جگہ اپنے ساتھ لے کر جاتا ہے۔

عملی طور پر closures اس طرح کام کرتے ہیں:

  • Private Variables: آپ ڈیٹا کو بیرونی دنیا سے چھپا سکتے ہیں۔ بینک اکاؤنٹ کی مثال میں، balance ویری ایبل پرائیویٹ رہتا ہے۔ آپ اسے صرف مخصوص طریقوں جیسے deposit یا withdraw کے ذریعے تبدیل کر سکتے ہیں۔ یہ حساس ڈیٹا تک براہ راست رسائی کو روکتا ہے۔

  • Function Factories: آپ ایسے فنکشنز بنا سکتے ہیں جو دوسرے فنکشنز پیدا کرتے ہیں۔ ایک multiplier factory ایک double function یا triple function بنا سکتی ہے۔ ہر نیا فنکشن اپنے مخصوص multiplier کو اپنے بیگ میں محفوظ رکھتا ہے۔

  • Event Listeners: جب آپ کسی بٹن پر click event لگاتے ہیں، تو handler سیٹ اپ فنکشن کے ڈیٹا کو یاد رکھتا ہے۔ سیٹ اپ فنکشن کے مکمل ہونے کے بعد بھی، listener اس ڈیٹا کو برقرار رکھتا ہے۔

  • React Hooks: جب بھی آپ useState یا useEffect استعمال کرتے ہیں، آپ closures استعمال کر رہے ہوتے ہیں۔ React میں ایک عام بگ (bug) تب ہوتا ہے جب ایک closure state کی پرانی ویلیو کو پکڑ لیتا ہے۔ اسے stale closure کہا جاتا ہے۔

میموری کے استعمال کا خیال رکھیں۔ چونکہ closure ویری ایبلز کا ایک لائیو ریفرنس (live reference) رکھتا ہے، اس لیے جب تک closure موجود ہے، انجن انہیں garbage collection کے ذریعے صاف نہیں کر سکتا۔ اگر آپ کو طویل عرصے تک ضرورت نہیں ہے تو closure میں بڑے (massive) objects رکھنے سے گریز کریں۔

خلاصہ:

  • Lexical scope رسائی (access) کو متعین کرتا ہے۔
  • Closures اس رسائی کو مستقل بناتے ہیں۔
  • ایک فنکشن اپنے ماحول کو ایک بیگ میں لے کر چلتا ہے۔
  • scoping bugs سے بچنے کے لیے loops میں var کے بجائے let استعمال کریں۔

ذریعہ: https://dev.to/digitalunicon/javascript-closures-explained-with-examples-339f