Skip to main content
JavaScript & the browser·Module C6 · Lesson 4
TaskWrite function* fizz() that yields the strings 'fizz','buzz','fizzbuzz' (in that order). Use for-of to log each. Then write function* range(from, to) and log [...range(5, 8)].join(',') — should print 5,6,7,8.

Generators: function* and yield

150 XP9 min
Theory

What a generator gives you

A function* (note the asterisk) returns a generator — an object that's BOTH an iterator AND iterable. Each yield produces the next value; execution pauses there and resumes on the next .next() call.

function* range(from, to) {
  for (let n = from; n <= to; n++) yield n;
}

for (const n of range(1, 3)) console.log(n); // 1, 2, 3
[...range(1, 3)];                             // [1, 2, 3]

Same result as the Symbol.iterator object in C6-03 — five lines instead of fifteen.

Yielding sequences

yield can be called any number of times, in any pattern:

function* greet() {
  yield "hi";
  yield "there";
  yield "friend";
}

Each yield is a checkpoint. The generator's runtime saves the function's local state between calls — that's why you can have an explicit for loop with yield inside it.

return inside a generator

return value finishes the generator immediately. Subsequent .next() calls return { value: undefined, done: true }.

🔒

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.

Sign up — free trial →

First 10 lessons in each track are free. No card needed for those.

PreviousNext lesson →

Get one Python or web tip a day — by email

Short, hand-written, no spam. Unsubscribe in one click.