W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Dart 是一門(mén)詞法作用域的編程語(yǔ)言,就意味著變量的作用域是固定的, 簡(jiǎn)單說(shuō)變量的作用域在編寫(xiě)代碼的時(shí)候就已經(jīng)確定了。 花括號(hào)內(nèi)的是變量可見(jiàn)的作用域。
下面示例關(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() 可以訪問(wèn)所有的變量, 一直到頂級(jí)作用域變量。
閉包 即一個(gè)函數(shù)對(duì)象,即使函數(shù)對(duì)象的調(diào)用在它原始作用域之外, 依然能夠訪問(wèn)在它詞法作用域內(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);
}
下面是頂級(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è)值。 如果沒(méi)有明確指定返回值, 函數(shù)體會(huì)被隱式的添加 return null; 語(yǔ)句。
foo() {} assert(foo() == null);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: