𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 𝗖𝗹𝗼𝘀𝘂𝗿𝗲𝘀 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱 (JavaScript Closures వివరణ)
మీరు ప్రతిరోజూ JavaScriptలో closures ఉపయోగిస్తారు. మీరు బహుశా వాటిని React hooks, event listeners మరియు Node.js callbacksలలో ఉపయోగిస్తుంటారు. చాలా మంది డెవలపర్లు దీని సిద్ధాంతాన్ని అర్థం చేసుకోవడంలో ఇబ్బంది పడతారు, కానీ ఒకసారి ఆ పద్ధతిని (pattern) గమనిస్తే ఈ కాన్సెప్ట్ చాలా సరళంగా ఉంటుంది.
Closures గురించి అర్థం చేసుకోవాలంటే, మీరు lexical scope గురించి తెలుసుకోవాలి.
Lexical scope అంటే ఒక ఫంక్షన్ దాని స్వంత scope నుండి మరియు అది నిర్వచించబడిన (defined) ఏవైనా బాహ్య (outer) scope నుండి వేరియబుల్స్ను యాక్సెస్ చేయగలదు అని అర్థం. ఇది మీరు కోడ్ను ఎక్కడ రాశారనే దానిపై ఆధారపడి ఉంటుంది, మీరు దానిని ఎక్కడ పిలుస్తారు (call చేస్తారు) అనే దానిపై కాదు.
Closure అనేది ఒక ఫంక్షన్, అది దాని అసలు scope పని పూర్తి అయిన తర్వాత కూడా ఆ scopeలోని వేరియబుల్స్ను గుర్తుంచుకుంటుంది.
ఒక ఫంక్షన్ను ఒక బ్యాక్ప్యాక్ (backpack) మోసుకెళ్తున్నట్లు ఊహించుకోండి. ఫంక్షన్ సృష్టించబడినప్పుడు, దానికి అవసరమైన ప్రతి వేరియబుల్ను దాని పరిసరాల (environment) నుండి ఆ బ్యాక్ప్యాక్లో సర్దుకుంటుంది. ఆ ఫంక్షన్ ఎక్కడికి వెళ్లినా ఆ బ్యాక్ప్యాక్ను వెంట తీసుకెళ్తుంది.
క్షేత్రస్థాయిలో (in practice) closures ఎలా పనిచేస్తాయో ఇక్కడ చూడండి:
Private Variables: మీరు డేటాను బయటి ప్రపంచం నుండి దాచవచ్చు. బ్యాంక్ ఖాతా ఉదాహరణలో, balance అనే వేరియబుల్ ప్రైవేట్గా ఉంటుంది. మీరు దానిని deposit లేదా withdraw వంటి నిర్దిష్ట పద్ధతుల (methods) ద్వారా మాత్రమే మార్చగలరు. ఇది సున్నితమైన డేటాకు నేరుగా యాక్సెస్ రాకుండా నిరోధిస్తుంది.
Function Factories: మీరు ఇతర ఫంక్షన్లను సృష్టించే ఫంక్షన్లను తయారు చేయవచ్చు. ఒక multiplier factory ద్వారా double function లేదా triple function వంటి వాటిని సృష్టించవచ్చు. ప్రతి కొత్త ఫంక్షన్ దాని బ్యాక్ప్యాక్లో దాని స్వంత ప్రత్యేక multiplierని ఉంచుకుంటుంది.
Event Listeners: మీరు ఒక బటన్కు click eventను జోడించినప్పుడు, ఆ handler సెటప్ ఫంక్షన్ నుండి డేటాను గుర్తుంచుకుంటుంది. సెటప్ ఫంక్షన్ పూర్తయిన తర్వాత కూడా, ఆ listener ఆ డేటాను తన వద్దే ఉంచుకుంటుంది.
React Hooks: మీరు ప్రతిసారీ useState లేదా useEffect ఉపయోగించినప్పుడు, మీరు closures ఉపయోగిస్తున్నారు. Reactలో ఒక సాధారణ బగ్ ఏమిటంటే, closure స్టేట్ యొక్క పాత విలువను (old value) క్యాప్చర్ చేయడం. దీనిని stale closure అని పిలుస్తారు.
మెమరీ వినియోగాన్ని (memory usage) గమనించండి. Closure అనేది వేరియబుల్స్కు live referenceను కలిగి ఉండటం వల్ల, closure ఉన్నంత వరకు ఇంజిన్ వాటిని garbage collection ద్వారా తొలగించలేదు. మీకు అవి ఎక్కువ కాలం అవసరం లేకపోతే, closureలో భారీ ఆబ్జెక్ట్లను (massive objects) ఉంచడం మానుకోండి.
సారాంశం:
- Lexical scope యాక్సెస్ను నిర్వచిస్తుంది.
- Closures ఆ యాక్సెస్ను శాశ్వతంగా (persistent) ఉంచుతాయి.
- ఒక ఫంక్షన్ దాని environmentను బ్యాక్ప్యాక్లో మోసుకెళ్తుంది.
- Scoping బగ్స్ను నివారించడానికి లూప్లలో var కి బదులుగా let ఉపయోగించండి.
మూలం: https://dev.to/digitalunicon/javascript-closures-explained-with-examples-339f