Skip to main content
← ⚑ JavaScript & the browserΒ·Module C6 Β· Lesson 5
TaskDefine function* naturals() (infinite 1,2,3,...) and function* take(iter, n) that yields first n items. Log [...take(naturals(), 5)].join(','). Then count squares with function* squares() that yields n*n for each natural, log [...take(squares(), 4)].join(',').

Lazy infinite sequences

175 XP10 min
Theory

Generators don't have to end

A generator only computes the next value when you ask. An infinite while (true) loop with yield is perfectly fine β€” the runtime never gets stuck because each yield pauses execution.

function* naturals() {
  let n = 1;
  while (true) yield n++;
}

You can NOT for-of an infinite generator without a break. You CAN take a finite prefix:

function* take(iter, n) {
  let i = 0;
  for (const x of iter) {
    if (i++ >= n) return;
    yield x;
  }
}

console.log([...take(naturals(), 5)]); // [1, 2, 3, 4, 5]

Why lazy matters

  • Memory β€” you never materialize the whole sequence.
  • Composition β€” take(filter(map(naturals(), x => x*x), x => x > 50), 3) walks naturals exactly until 3 results are found, no more.
  • This is how reactive frontend frameworks model streams of events under the hood.

The pattern in production

Pagination, event streams, message queues, anything-with-backpressure. Lesson C6-08 shows the async version that powers paginated APIs.

πŸ”’

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.