聲明:文章都是搬運(yùn)并整理
Dart是一種真正面向?qū)ο蟮恼Z言八毯,所以函數(shù)也是對象并且類型為Function
,這意味函數(shù)可以被賦值給變量或者作為其他函數(shù)的參數(shù)绢涡。你也可以像調(diào)用函數(shù)一樣調(diào)用Dart 類的實例
參數(shù)
- 函數(shù)可以有兩種形式的參數(shù): 必要參數(shù)和可選參數(shù)
- 必要參數(shù)定義在參數(shù)列表的前面,
- 可選參數(shù)定義在必要參數(shù)的后面
可選參數(shù)
- 可選參數(shù)分為命名參數(shù)和位置參數(shù)
- 可在參數(shù)列表中任選其一使用鳖轰,但是不能混用
// 可選參數(shù) 設(shè)置默認(rèn)值
var add(int a ,int b,{int c = 0, int d}){
return a+b;
}
main(){
int c = add(2,3);
int d = add(2,3,c:4,d:5);
}
- 使用 參數(shù)名:參數(shù)值的形式來指定命名參數(shù)
- 用大括號來指定命名參數(shù)
- 可以提供默認(rèn)值
- @required 注解來標(biāo)示一個命名參數(shù)是必須的參數(shù)
位置參數(shù)
int addValue(int a,[int b, int c]){
return a+(b??0)+(c??0);
}
addValue(1);
addValue(1,2);
addValue(1,2,3);
int addValue(int a,[int b=0,int c =0]){
return a+b+c;
}
- 使用[]將一系列參數(shù)包裹起來作為位置參數(shù)
- 可以用 = 為函數(shù)的位置參數(shù)定義默認(rèn)值清酥,默認(rèn)值必須為編譯時常量,沒有指定默認(rèn)值的情況下默認(rèn)值為null
main() 函數(shù)
每個Dart 程序都必須有一個main() 頂級函數(shù)作為程序的入口蕴侣,main()函數(shù)返回值void 并且有一個List<String> 類型的可選參數(shù)
函數(shù)作為一級對象
- 可以將函數(shù)作為參數(shù)傳遞給另一個函數(shù)
- 可以將函數(shù)賦值給給一個變量
main(){
add(1,2,addResult);
var temp = addResult; //將函數(shù)賦值給一個變量
add(1,2,(v){ //匿名函數(shù)
print(v);
});
var a =(v)=>"xxx $v"; //箭頭函數(shù)
add(1,2,(v)=>{
print(v)
});
}
// 將addResult 作為參數(shù)傳如add函數(shù)中焰轻。
add(int a,int b,Function callback){
callback(a+b); // 調(diào)用addResult
}
addResult(int result){
print(result);
}
匿名函數(shù)
- 沒有名字的函數(shù)就是匿名函數(shù)
- 稱之為匿名函數(shù),或Lambda表達(dá)式 或 Closure 閉包
([[類型] 參數(shù)[,...]]){
函數(shù)體昆雀;
}辱志;
立即執(zhí)行函數(shù)
((name){
print('my name is ${name}');
})('postbird'); //my name is postbird
詞法作用域
- 變量的作用域在寫代碼的時候就確定來
- 大括號內(nèi)定義的變量只能在大括號內(nèi)訪問
詞法閉包
- 閉包 即一個函數(shù)對象,即使函數(shù)對象的調(diào)用在它原始作用域之外狞膘,依然能訪問在它詞法作用域的變量
Function getA() {
int a = 0;
return () {
a++;
print(a);
};
}
Function b = getA();
b(); //1
b(); //2
函數(shù)是否相等
void foo(){} //頂層函數(shù)
class A {
static void bar(){} //定義靜態(tài)方法
void baz() {} // 定義實例方法
}
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;
// 這兩個閉包引用來相同的實例對象挽封,因此它們相等已球。
assert(y.baz == x);
// 這兩個閉包引用來不同的實例對象,因此它們不相等。
assert(v.baz != w.baz);
}
返回值
- 所有函數(shù)都有返回值
- 沒有顯示返回語句的函數(shù)最后一行默認(rèn)執(zhí)行return null