声明函数
- 直接声明
- Dart中声明函数不需要function关键字
- 箭头函数
+Dart中 的箭头函数中,函数体只能写一行且不能带有结束的分号
+Dart中的箭头函数,只是函数的一种简写形式 - 匿名函数
- 立即执行函数
//Dart中声明函数,不需要function关键字
void printInfo(){
print('Hello ,World');
}
//返回值与函数声明的类型要一致
int getNum(){
// return 'Hello';//不能返回字符串类型
return 1;
}
//匿名函数
var myPrint =(value){
print(value);
};
List fruits=['苹果','香蕉','猕猴桃'];
fruits.forEach(myPrint);
//箭头函数
fruits.forEach((element)->{
print(element)//箭头函数中,不能写结束的分号(;)
});
fruits.forEach((element)=>print(element));
//立即执行函数
((int n){
print(n);
})(17);
void main(){
//调用函数
printInfo();
}
函数参数
- 必填参数
- 参数类型 参数名称
- 可选参数
- 放在必选参数后面
- 通过中括号包裹起来
- 带默认值的可选参数
- 命名参数
- 用大括号包裹起来
- 调用函数时,命名参数的名称与声明函数中的名称保持一致
- 函数参数
void main(){
//必填参数
String userInfo(String name){
return '你好,$name';
}
String res =userInfo('张三');
print(res);
//同一个作用域中函数名不能重名,这个地方跟java不一样,java可以重载方法
//可选参数
String userInfo(String name,[dynamic age]){
return '你好,$name,年龄:$age';
}
String res =userInfo('张三',20);
print(res);
}
//命名参数
String userInfo(String name,{int age =0} ){
return '你好,$name,年龄:$age';
}
//命名参数调用时,需要与声明时的形参一致
String res =userInfo('张三',age:20);
print(res);
}
//函数参数
var myPrint =(value){
print(value);
}
List fruits =['苹果','香蕉','猕猴桃']
//将匿名函数myPrint传递给函数forEach
fruits.forEach(myPrint);
作用域和闭包
- Dart中闭包的实现方式与JavaScript中完全一致
- 使用时机:既能重用变量,又保护变量不被污染
-
实现原理:外层函数被调用后,外层函数的作用域对象(AO)被内层函数引用着,导致外层函数的作用域对象无法释放,从而形成闭包
image.png
image.png
下一节
异步函数