makeAdder
函数返回函数。它返回的函数是通过计算函数表达式创建的(num i) => addBy + i
。当您评估一个函数表达式时,您会创建一个函数值。函数值也称为闭包,因为它包含(“关闭”)函数体中的所有“自由”变量——那些没有由函数表达式本身声明的变量
在这种情况下,函数表达式(num i) => addBy + i
包含自由变量addBy
。函数值/闭包知道该变量的含义 - 它是makeAdder
对函数表达式进行评估的调用的参数。每次调用makeAdder
都会创建一个新addBy
变量,并且每次调用还会创建一个关闭该新变量的新闭包。
闭包不仅仅是存储变量的值,它还引用了变量本身。您可以看到,如果您的闭包更改了变量的值。
例子:
/// Creates a counter function which returns a new value each call.
///
/// The counter function starts at [start] and increments by [step]
/// each time it is called.
int Function() makeCounter([int start = 1, int step = 1]) {
var value = start - step;
return () => value += step;
}
main() {
var countFrom1 = makeCounter();
var countFast = makeCounter(1, 2);
var countFrom100 = makeCounter(100);
// Prints 1, 2, 3, 4, 5:
for (var i = 0; i < 5; i++) print(countFrom1());
// Prints 1, 3, 5, 7, 9:
for (var i = 0; i < 5; i++) print(countFast());
// Prints 100, 101, 102, 103, 104:
for (var i = 0; i < 5; i++) print(countFrom100());
print(countFrom1()); // Prints 6.
}