Dart

Dart - 函数(词法闭包、函数对象相等和返回值)

2019-12-13  本文已影响0人  LouisXWB

词法闭包

闭包 即一个函数对象,即使函数对象的调用在它原始作用域之外,依然能够访问在它词法作用域内的变量。

函数可以封闭定义到它作用域内的变量。接下来的示例中,函数 makeAdder()捕获了变量 addBy。无论函数在什么时候返回,它都可以使用捕获的addBy 变量。

/// 返回一个将 [addBy] 添加到该函数参数的函数。
/// Returns a function that adds [addBy] to the
/// function's argument.
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // 生成加 2 的函数。
  var add2 = makeAdder(2);

  // 生成加 4 的函数。
  var add4 = makeAdder(4);

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

支持多个括号的连续调用:

Function generateFunc(int i){
    return (item)=> item+i;
  }
  
  var func = generateFunc(100);
  print(generateFunc(100)(10000));

测试函数是否相等

函数既然是对象,也可以比较是否相等:

void foo() {} // 定义顶层函数 (A top-level function)

class A {
  static void bar() {} // 定义静态方法
  void baz() {} // 定义实例方法
}

void main() {
  var x;

  // 比较顶层函数是否相等。
  x = foo;
  assert(foo == x);//true

  // 比较静态方法是否相等。
  x = A.bar;
  assert(A.bar == x);//true

  // 比较实例方法是否相等。
  var v = A(); // A 的实例 #1
  var w = A(); // A 的实例 #2
  var y = w;
  x = w.baz;

  // 这两个闭包引用了相同的实例对象,因此它们相等。
  assert(y.baz == x);//true

  // 这两个闭包引用了不同的实例对象,因此它们不相等。
  assert(v.baz != w.baz);//true
}

返回值

所有的函数都有返回值。没有显示返回语句的函数最后一行默认为执行 return null。

foo() {}

assert(foo() == null);
上一篇下一篇

猜你喜欢

热点阅读