dart - Dart 。匿名函数的论证从哪里来?

标签 dart anonymous-function lexical-closures

在下面的示例中,出现(num i)东西,当makeAddr()称为吗?

Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // Create a function that adds 2.
  var add2 = makeAdder(2);

  // Create a function that adds 4.
  var add4 = makeAdder(4);

  assert(add2(3) == 5);
  assert(add4(3) == 7);
}

最佳答案

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.
}

关于dart - Dart 。匿名函数的论证从哪里来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51201820/

相关文章:

flutter - 如何在命名构造函数中使用异步?

dart - 在 Flutter 中使用完整的 Dart SDK

javascript - 我如何使用自执行匿名函数中的对象?

python - 将方法绑定(bind)到对象运行时后期绑定(bind)

google-app-engine - 无法解决 Dart App Engine 依赖性

dart - Dart 射程法

javascript - 为什么要使用命名函数表达式?

r - 在 scale_y_continuous 中使用匿名函数

javascript - 从axios访问VUE JS的数据