JavaScript Performance Optimization: Debounce vs Throttle Explained