JavaScript Closure Memory Leak Prevention Code Examples
JavaScript closure memory leak prevention best practices for beginners: Ready-to-use code snippets and utilities for safe memory management.
JavaScript Closure Memory Leak Prevention Code Examples for Beginners
JavaScript closure memory leak prevention best practices for beginners require practical, ready-to-use code examples. This collection provides essential utilities and patterns to help you write memory-efficient JavaScript applications.
Safe Event Handler Utility #
Create event handlers that automatically clean up references:
Memory-Safe Timer Manager #
Manage timers without memory leaks:
// Timer manager utility
function createTimerManager() {
const timers = new Set();
return {
// Create safe setTimeout
setTimeout: function(callback, delay) {
const timerId = setTimeout(() => {
callback();
timers.delete(timerId);
}, delay);
timers.add(timerId);
return timerId;
},
// Create safe setInterval
setInterval: function(callback, interval) {
const timerId = setInterval(callback, interval);
timers.add(timerId);
return timerId;
},
// Clear specific timer
clearTimer: function(timerId) {
clearTimeout(timerId);
clearInterval(timerId);
timers.delete(timerId);
},
// Clear all managed timers
clearAll: function() {
timers.forEach(timerId => {
clearTimeout(timerId);
clearInterval(timerId);
});
timers.clear();
}
};
}
// Usage example
const timerManager = createTimerManager();
const intervalId = timerManager.setInterval(() => {
console.log('Safe interval tick');
}, 1000);
// Clean up after 5 seconds
timerManager.setTimeout(() => {
timerManager.clearAll();
console.log('All timers cleared');
}, 5000);
Weak Reference Cache #
Use WeakMap for memory-safe caching:
DOM Reference Manager #
Safely manage DOM element references:
// DOM reference manager
function createDOMManager() {
const elements = new WeakMap();
const cleanup = new Set();
return {
// Register DOM element
register: function(element, data = {}) {
elements.set(element, data);
// Add cleanup function
const cleanupFn = () => {
if (element.parentNode) {
element.parentNode.removeChild(element);
}
};
cleanup.add(cleanupFn);
return cleanupFn;
},
// Get element data
getData: function(element) {
return elements.get(element);
},
// Update element data
setData: function(element, data) {
if (elements.has(element)) {
elements.set(element, { ...elements.get(element), ...data });
}
},
// Clean up all registered elements
cleanup: function() {
cleanup.forEach(cleanupFn => {
try {
cleanupFn();
} catch (e) {
console.warn('Cleanup error:', e);
}
});
cleanup.clear();
}
};
}
// Usage example
const domManager = createDOMManager();
const div = document.createElement('div');
div.textContent = 'Managed element';
document.body.appendChild(div);
domManager.register(div, { type: 'content', created: Date.now() });
// Clean up after 3 seconds
setTimeout(() => {
domManager.cleanup();
console.log('DOM elements cleaned up');
}, 3000);
Memory Leak Detector #
Utility to detect potential memory leaks:
Closure Factory with Cleanup #
Create closures with built-in cleanup mechanisms:
// Safe closure factory
function createSafeClosure(initialData) {
let data = initialData;
let isActive = true;
const resources = [];
// Cleanup function
function cleanup() {
isActive = false;
data = null;
// Clean up all tracked resources
resources.forEach(cleanupFn => {
try {
cleanupFn();
} catch (e) {
console.warn('Resource cleanup error:', e);
}
});
resources.length = 0;
}
return {
// Get data safely
getData: function() {
return isActive ? data : null;
},
// Set data safely
setData: function(newData) {
if (isActive) {
data = newData;
}
},
// Add resource for cleanup tracking
addResource: function(cleanupFn) {
if (isActive && typeof cleanupFn === 'function') {
resources.push(cleanupFn);
}
},
// Check if closure is active
isActive: function() {
return isActive;
},
// Cleanup closure
destroy: cleanup
};
}
// Usage example
const safeClosure = createSafeClosure({ message: 'Hello World' });
// Add some resources to track
const timer = setInterval(() => {
console.log(safeClosure.getData()?.message || 'Cleaned up');
}, 1000);
safeClosure.addResource(() => clearInterval(timer));
// Clean up after 5 seconds
setTimeout(() => {
safeClosure.destroy();
console.log('Closure destroyed');
}, 5000);
Memory-Efficient Module Pattern #
Create modules that properly manage memory:
Summary #
These JavaScript closure memory leak prevention best practices for beginners provide:
- Safe Event Handlers: Automatic cleanup with AbortController
- Timer Management: Centralized timer tracking and cleanup
- Weak Reference Caching: Memory-safe caching with WeakMap
- DOM Reference Management: Safe DOM element handling
- Memory Leak Detection: Tools to monitor memory usage
- Safe Closure Factory: Closures with built-in cleanup
- Memory-Efficient Modules: Proper resource management patterns
Use these utilities in your projects to prevent memory leaks and ensure optimal performance. Remember to always clean up resources when they're no longer needed.
Explore more memory leak prevention techniques or check out our JavaScript error handling utilities.