भूल गए टाइमर/कॉलबैक
जावास्क्रिप्ट में दो टाइमिंग इवेंट होते हैं, अर्थात् सेटटाइमआउट () और सेटइंटरवल ()। पूर्व एक निर्दिष्ट संख्या में मिलीसेकंड की प्रतीक्षा करने के बाद एक फ़ंक्शन निष्पादित करता है, जबकि बाद वाला समय-समय पर एक फ़ंक्शन निष्पादित करता है (समय के प्रत्येक निश्चित अंतराल के लिए दोहराता है)।
जब कोई ऑब्जेक्ट टाइमर कॉलबैक से जुड़ा होता है, तो इसे टाइमआउट होने तक रिलीज़ नहीं किया जाएगा। इस परिदृश्य में टाइमर खुद को रीसेट करता है और टाइमआउट के पूरा होने तक हमेशा के लिए चलता है, कचरा कलेक्टर को मेमोरी को हटाने की अनुमति नहीं देता है। ये टाइमर जावास्क्रिप्ट में मेमोरी लीक का सबसे आम कारण हैं।
उदाहरण
निम्नलिखित उदाहरण में, टाइमर कॉलबैक और इसकी बंधी हुई वस्तु (tiedObject) को टाइमआउट समाप्त होने तक जारी नहीं किया जाएगा। इस बीच टाइमर खुद को रीसेट करता है और हमेशा के लिए चलता है और इसलिए इसका मेमोरी स्पेस कभी भी एकत्र नहीं किया जाएगा यहां तक कि मूल वस्तु का कोई संदर्भ भी नहीं है।
<html> <body> <script> for (var i = 0; i < 100000; i++) { var tiedObject = { callAgain: function() { var text = this; var value = setTimeout(function() { text.callAgain(); }, 100000); } } tiedObject.callAgain(); tiedObject = null; } </script> </body>> </html>
मेमोरी लीक से बचना
1. रिसाव से बचने के लिए सेटइंटरवल ()/सेटटाइमआउट () के अंदर संदर्भ प्रदान करें जैसे कि कचरा एकत्र करने से पहले कार्यों को निष्पादित करने की आवश्यकता होती है।
2. कार्यों को हटाने के लिए सीधे कॉल करें जब उनकी आवश्यकता नहीं रह जाती है।
पुराने ब्राउज़र जैसे IE को छोड़कर, अधिकांश आधुनिक ब्राउज़र जैसे क्रोम आदि को इस तरह की समस्याओं का सामना नहीं करना पड़ेगा। अधिक महत्वपूर्ण बात यह है कि jQuery जैसे पुस्तकालय आंतरिक रूप से यह सुनिश्चित करने के लिए संभालते हैं कि कोई रिसाव समस्या उत्पन्न न हो।