Dart是一种真正的面向对象语言,所以即使函数也是对象,具有类型和功能。这意味着函数可以分配给变量或作为参数传递给其他函数。
定义函数的三种方法
1.明确的返回值和参数类型
String getName(String name){
return "${name} is the name";
}
- dynamic 方式 自动判断返回值和参数的类型
省略了类型,这个函数仍然可以工作:
getName2( name){
return "${name} is the name";
}
- => 箭头函数
对于只包含一个表达式的函数,可以使用简写语法
String getName3(String name) => "${name} is the name";
参数的定义
- 必传参数
表明这个参数在函数调用的时候是必须传的
void getNum(num number){}
2.可选参数
在定义函数时,使用{param1,param2,…}来指定命名参数,比如:
num getNum2({num num1 , num num2}) => (num1 ?? 0)+ (num2 ?? 0); // 其中的两个参数可传可不传
//函数调用
print(getNum2(num2: 1));//必须带上参数名
使用@required说明它是一个必传的参数
const Scrollbar({Key key, @required Widget child})//第二个参数必须传递
3.可选的位置参数
使用[param1,param2,…]来表示
num getNum3([num num1 , num num2]) => (num1 ?? 0)+ (num2 ?? 0);
print(getNum3(1,2)); // 可以不用参数名,第一个参数就是num1 第二个就是num2
4.默认参数值 :
参数如果没有传递,就使用默认的值
num getNum4([num num1 = 10 , num num2 = 10]) => (num1 ?? 0)+ (num2 ?? 0);
//print(getNum4(1));// 11
函数
main()函数
每个应用程序都必须有一个顶级的main()函数,它作为应用程序的入口点。main()函数返回void,并有一个可选的列表参数作为参数
将函数传递给另一个函数
void addOne(int num) => print(num + 1);
var arr = [0,1,2,3,];
arr.forEach(addOne);
为变量分配函数
var name = (msg) => '!!! ${msg.toUpperCase()} !!!';
print(name("yh")); //!!! YH !!!
匿名函数
说的简单一点就是没有名字的函数
sayHello(void temp(String str)){
temp('hello');
}
sayHello((str) {
print(str.toUpperCase());//HELLO 这里相当于temp函数体的内容
});
/*
void forEach(void f(E element)) {
for (E element in this) f(element);
}
*/
闭包函数
: 是一个方法对象,不论对象在何处被调用,改对象都能访问自己作用域内的变量
count(int number){
var res = number + 1;
return (temp){
print(res + temp);
};
}
var func = count(1);
func(123); //123+2 = 125
返回值
函数都有返回值,如果没有指定return , 会隐式的返回一个null