Hi dev.to! Today I'm writing about closures and one interesting way they can be used.
You've probably seen this slow implementation of the Fibonacci series before:
// O(2^N) time
function fib(n) {
if (n === 0) return 0;
if (n < 3) return 1;
return fib(n - 1) + fib(n - 2);
We can rewrite the solution to make it run faster, or we can leverage higher order functions to do the hard work for us.
function memoize(cb) {
const cache = {};
return function (...args) {
const key = args.join('-');
if (!(key in cache)) cache[key] = cb(...args);
return cache[key];
};
}
// now fib is O(N) time!
fib = memoize(fib);
If this is confusing - don't worry! There's a lot going on here, but once you become more familiar with closures writing code like this will feel natural.
I go into detail about how this works in the following video: https://www.youtube.com/watch?v=9Iyj-foHNmQ
Thanks for reading. Of course, there's plenty more advanced use cases for closures such as callbacks in react component and debouncing. I'd like to hear about any nifty closure use cases you've come across.
Top comments (0)