Closures in Dart

Dart supports anonymous functions, which can form closures. Anonymous functions are useful when you want to define a function inline without having to name it.

import 'dart:core';

// This function intSeq returns another function, which
// we define anonymously in the body of intSeq. The
// returned function closes over the variable i to
// form a closure.
Function intSeq() {
  int i = 0;
  return () {
    i++;
    return i;
  };
}

void main() {
  // We call intSeq, assigning the result (a function)
  // to nextInt. This function value captures its
  // own i value, which will be updated each time
  // we call nextInt.
  var nextInt = intSeq();

  // See the effect of the closure by calling nextInt
  // a few times.
  print(nextInt());
  print(nextInt());
  print(nextInt());

  // To confirm that the state is unique to that
  // particular function, create and test a new one.
  var newInts = intSeq();
  print(newInts());
}

To run the program:

$ dart closures.dart
1
2
3
1

In this Dart example, we’ve created a closure using an anonymous function. The intSeq function returns another function that increments and returns a counter. Each time we call intSeq(), it creates a new instance of the counter, demonstrating how closures capture and maintain their own state.

The last feature of functions we’ll look at for now is recursion.