Title here
Summary here
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.