(1) 函数的返回类型可以省略 (不建议省略)。若省略,DartVM默认会在函数内的最后一行加上return null。
(2) 函数都有返回类型,void类型函数实际返回null
(3) 函数可以在函数内部定义,无限嵌套
(4) 支持缩写语法=>
(5) 支持可选命名参数
(6) 支持可选位置参数
(7) 支持闭包
(8) 支持匿名函数
(9)支持typedef关键字
void main() {
}
func() {
return null; //若不写,DartVM会默认加上
}
void main() {
int defineFun() {
return 1+1;
}
}//defineFun函数只能在main函数内部调用
当函数的{}内只有一行代码时,可以使用=>代替{},比如:
void todo() {
print("Hello");
}
void todo2() => print("Hello");
int todo3(int a, int b) => a+b;
int optionalNamedFun({int a=0, int b=0, int c}) {
return a+b+c;
}
var x = optionalNamedFun(a:2,b:3);
print(x); //5
比如,上面的代码中c没有赋初始值,就会报下面的错,所以一定要记得在运算时赋初始值,不然DartMV会给null
lib/dartEx2.dart: Warning: Interpreting this as package URI, 'package:flutter_demo/dartEx2.dart'. Unhandled exception: NoSuchMethodError: The method '_addFromInteger' was called on null. Receiver: null Tried calling: _addFromInteger(5) #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5) #1 int.+ (dart:core-patch/integers.dart:10:38) #2 optionalNamedFun (package:flutter_demo/dartEx2.dart:19:13) #3 main (package:flutter_demo/dartEx2.dart:4:11) #4 _startIsolate.(dart:isolate-patch/isolate_patch.dart:301:19) #5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
也可以这样写,固定参数+可选参数
int optionalNamedFun(int z,{int a=0, int b=0, int c=0}) {
return z+a+b+c;
}
var x = optionalNamedFun(1,a:2,b:3);
print(x); //6
把可选参数放到 [] 中,必填参数要放在可选参数前面
int optionalLocationFun(int z,[int a=0, int b=0, int c=0]) {
return z+a+b+c;
}
var x = optionalLocationFun(1,2); //这里的2是给a赋值。
var y = optionalLocationFun(1); //这里的1是给z赋值。
print(x);
print(y);
Ps: 如果在参数中,定义的是集合,需要注意如下,必须使用const进行修饰
int optionalCollection({List list = const[1,2,3]}) {
}
一个可以使用另外一个函数作用域中的变量的函数。
Function closureFun(int a) {
return (int b)=> a+b;
}
var operationFun = closureFun(20); // a=20
print(operationFun(25)); // b=25
没有函数名称的函数。
可赋值给变量,通过变量调用,可以把匿名函数看成一个对象。也可在其他函数中直接调用或传递给其他函数。
var printNoParamsFun = () => print("Hello"); //无参匿名函数
var printParamsFun = (param) => print(param); //有参匿名函数
(()=>print("hello"))(); //不推荐
int Function(int i) anonymousFuc = (int i) => i + 1;
print(anonymousFuc(1)+3); //5
//源码中的forEach方法
void forEach(void f(E element)) {
for (E element in this) f(element);
}
typedef就是给定义的函数取个别名,然后就可以使用operationFun来声明一个函数变量,这样就能清晰的表明了函数参数的类型及返回值的类型。
void main(){
OperationFun add(int a, int b){
print(a+b);
}
OperationFun fun = add(1, 2);
}
typedef OperationFun(int a, int b);