Dart 是一門詞法作用域的編程語言,就意味著變量的作用域是固定的, 簡單說變量的作用域在編寫代碼的時候就已經(jīng)確定了。 花括號內的是變量可見的作用域。
下面示例關于多個嵌套函數(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() 可以訪問所有的變量, 一直到頂級作用域變量。
閉包 即一個函數(shù)對象,即使函數(shù)對象的調用在它原始作用域之外, 依然能夠訪問在它詞法作用域內的變量。
函數(shù)可以封閉定義到它作用域內的變量。 接下來的示例中, makeAdder() 捕獲了變量 addBy。 無論在什么時候執(zhí)行返回函數(shù),函數(shù)都會使用捕獲的 addBy 變量。
/// 返回一個函數(shù),返回的函數(shù)參數(shù)與 [addBy] 相加。
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
void main() {
// 創(chuàng)建一個加 2 的函數(shù)。
var add2 = makeAdder(2);
// 創(chuàng)建一個加 4 的函數(shù)。
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
下面是頂級函數(shù),靜態(tài)方法和示例方法相等性的測試示例:
void foo() {} // 頂級函數(shù)
class A {
static void bar() {} // 靜態(tài)方法
void baz() {} // 示例方法
}
void main() {
var x;
// 比較頂級函數(shù)。
x = foo;
assert(foo == x);
// 比較靜態(tài)方法。
x = A.bar;
assert(A.bar == x);
// 比較實例方法。
var v = A(); // A的1號實例
var w = A(); // A的2號實例
var y = w;
x = w.baz;
// 兩個閉包引用的同一實例(2號),
// 所以它們相等。
assert(y.baz == x);
// 兩個閉包引用的非同一個實例,
// 所以它們不相等。
assert(v.baz != w.baz);
}
所有函數(shù)都會返回一個值。 如果沒有明確指定返回值, 函數(shù)體會被隱式的添加 return null; 語句。
foo() {} assert(foo() == null);
更多建議: