函數(shù)的其它概念(下)

2020-02-03 18:42 更新

詞法作用域

Dart 是一門詞法作用域的編程語(yǔ)言,就意味著變量的作用域是固定的, 簡(jiǎn)單說變量的作用域在編寫代碼的時(shí)候就已經(jīng)確定了。 花括號(hào)內(nèi)的是變量可見的作用域。

下面示例關(guān)于多個(gè)嵌套函數(shù)的變量作用域:

bool topLevel = true;

void main() {
  var insideMain = true;

  void myFunction() {
    var insideFunction = true;

    void nestedFunction() {
      var insideNestedFunction = true;

      assert(topLevel);
      assert(insideMain);
      assert(insideFunction);
      assert(insideNestedFunction);
    }
  }
}

注意 nestedFunction() 可以訪問所有的變量, 一直到頂級(jí)作用域變量。


詞法閉包

閉包 即一個(gè)函數(shù)對(duì)象,即使函數(shù)對(duì)象的調(diào)用在它原始作用域之外, 依然能夠訪問在它詞法作用域內(nèi)的變量。

函數(shù)可以封閉定義到它作用域內(nèi)的變量。 接下來(lái)的示例中, makeAdder() 捕獲了變量 addBy。 無(wú)論在什么時(shí)候執(zhí)行返回函數(shù),函數(shù)都會(huì)使用捕獲的 addBy 變量。

/// 返回一個(gè)函數(shù),返回的函數(shù)參數(shù)與 [addBy] 相加。
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // 創(chuàng)建一個(gè)加 2 的函數(shù)。
  var add2 = makeAdder(2);

  // 創(chuàng)建一個(gè)加 4 的函數(shù)。
  var add4 = makeAdder(4);

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


測(cè)試函數(shù)是否相等

下面是頂級(jí)函數(shù),靜態(tài)方法和示例方法相等性的測(cè)試示例:

void foo() {} // 頂級(jí)函數(shù)

class A {
  static void bar() {} // 靜態(tài)方法
  void baz() {} // 示例方法
}

void main() {
  var x;

  // 比較頂級(jí)函數(shù)。
  x = foo;
  assert(foo == x);

  // 比較靜態(tài)方法。
  x = A.bar;
  assert(A.bar == x);

  // 比較實(shí)例方法。
  var v = A(); // A的1號(hào)實(shí)例
  var w = A(); // A的2號(hào)實(shí)例
  var y = w;
  x = w.baz;

  // 兩個(gè)閉包引用的同一實(shí)例(2號(hào)),
  // 所以它們相等。
  assert(y.baz == x);

  // 兩個(gè)閉包引用的非同一個(gè)實(shí)例,
  // 所以它們不相等。
  assert(v.baz != w.baz);
}


返回值

所有函數(shù)都會(huì)返回一個(gè)值。 如果沒有明確指定返回值, 函數(shù)體會(huì)被隱式的添加 return null; 語(yǔ)句。

foo() {}
assert(foo() == null);
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)