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.

查看推荐产品

Comments powered by Disqus