Javascript generator functions simplified

Photo by David Carboni on Unsplash

Javascript generator functions simplified

Mohsen Kamrani's photo
Mohsen Kamrani
·Jan 8, 2022·

3 min read

Subscribe to my newsletter and never miss my upcoming articles

One of the coolest features of javascript which surprisingly not many developers know about or use is generator functions. In this tutorial I'll try to explain the generator functions in simple terms and with the help of examples.

A generator function, in short, is a function whose execution can be paused and resumed!

Notice that in other functions we don't have such a control over the execution of the function. This is different from conditional statements and loops where you just control the flow of the execution not the execution itself.

Before diving deeper, let's see an example. Assume we want to have a function to return sequential numbers each time we call it. This is we do it normally:

let id = 0;
function getId() {
  return id++;
}

console.log(getId()) // 0
console.log(getId()) // 1
console.log(getId()) // 2

As you can see, actually to write such a function we have to use an external storage to keep the state of our function, a global variable id in this case. Obviously, now we have to take care of the global variable ourselves and the function doesn't have full control over it.

Now let's see how we do this with a generator function:

function* generateId(id = 0) {
  while (true) {
    yield id++;
  }
}
const ids = generateId();
console.log(ids.next().value) // 0
console.log(ids.next().value) // 1
console.log(ids.next().value) // 2

Ok, this looks crazy! I agree, and this is what I initially thought as well when I saw the syntax for the first time. But there is nothing we cannot break down!

function* means the function is a generator function, not bad huh? Then we have yield, which you can be thought of as a generator-based version of the return keyword. The main difference is that yield pauses the execution of the function unlike return that ends the execution.

I said pause and that's what I exactly meant. In our weird function we have an infinite loop, and here is where the magic of generator functions happen. Each time the generator function returns a value using the yield statement its execution gets paused until the next call through the iterator it has returned.

I mentioned iterator, but to be specific a generator function returns a generator which is an iterator on its own. That's why we access the values using the next method of the generator object (ids in our example).

Let's keep it short and simple. If you liked this post and want to know more about generator functions, yield, generators comment down bellow and I'll be more than happy to write about it.

Also please not forget to check utopiops.com for hosting your applications for free. We're in our public beta and will love to collaborate with our users in any possible way. Happy coding!

 
Share this