Dart函数是代码的构建块,用于执行特定的任务,并返回值,将代码逻辑划分为独立的功能模块,提高可读性和可维护性。
1 函数
- 函数即方法,内置的方法,例如:
print()
。 - 自定义方法,格式:
返回类型 方法名称(参数1, 参数2, ..., 参数n) { }
。
// 全局作用域
void printInfo() {
print('全局作用域');
printGlobal() {
print('局部作用域');
}
// 局部作用域只在局部调用
printGlobal();
}
void main() {
print('内置方法');
// 调用方法
printInfo();
// 全局作用域
int getNum() {
var myNum = 12345678;
return myNum;
}
// 调用方法
var n = getNum();
print(n);
}
2 参数
main() {
// 定义一个方法,求1到这个数的所有数之和
int sumNum(int n) {
var sum = 0;
for(var i=1; i<=n; i++) {
sum += i;
}
return sum;
}
var n = sumNum(20);
print(n);
// 定义一个方法,然后打印用户信息
// 方法传参:形参
String printUserInfo(String username, int age) {
return '姓名:$username --- 年龄:$age';
}
// 方法传参:实参
print(printUserInfo('张三', 21));
}
2-1 可选参数
main() {
// 定义一个方法,该方法带可选参数:[Data type Variable]
String printUserInfo(String username, [int age = 0]) {
if(age != null) {
return '姓名:$username --- 年龄:$age';
}
return '姓名:$username --- 年龄:保密';
}
// 方法传参:实参
print(printUserInfo('张三', 21));
}
2-2 默认参数
main() {
// 定义一个方法,该方法带默认参数:[Data type Variable = 'Default']
String printUserInfo(String username, [int age = 21]) {
if(age != null) {
return '姓名:$username --- 年龄:$age';
}
return '姓名:$username --- 年龄:保密';
}
// 方法传参:实参
print(printUserInfo('张三'));
print(printUserInfo('李四', 22));
}
2-3 命名参数
main() {
// 定义一个方法,该方法带命名参数:{Data type Variable = 'Default'}
String printUserInfo(String username, {int age = 0}) {
if(age != null) {
return '姓名:$username --- 年龄:$age';
}
return '姓名:$username --- 年龄:保密';
}
// 方法传参:实参
print(printUserInfo('张三', age: 21));
// 实现一个方法,该方法将另一个方法当作参数传入
fn1() {
print('将fn1作为一个参数传入fn2');
}
fn2(fName) {
fName();
}
fn2(fn1);
}
3 箭头函数
main() {
// 箭头函数:forEach打印List里的数据
List list = ['樱桃', '香蕉', '苹果'];
list.forEach((element) => print(element));
list.forEach((element) => {print(element)});
// 修改List里的数据,让数组中大于2的值乘以2
List listNum = [4, 1, 2, 3, 4];
var newList = listNum.map((e) {
if(e > 2) {
return e * 2;
}
return e;
});
print(newList.toList());
var newListNum = listNum.map((e) => e > 2 ? e * 2 : e);
print(newListNum.toList());
}
4 相互调用
main() {
// 定义一个方法,使用isEvenNumber判断一个数是否为偶数
bool isEvenNumber(int n) {
if(n % 2 == 0) {
return true;
}
return false;
}
// 定义一个方法,打印1-n以内的所有偶数
printNum(int n) {
for(var i=1; i<=n; i++) {
if(isEvenNumber(i)) {
print(i);
}
}
}
// 函数的相互调用
printNum(9);
}
5 匿名函数
main() {
// 匿名函数
var printNumber = (){
print(123);
};
printNumber();
}
6 方法递归
main() {
// 方法递归:条件满足的情况下在方法内调用自身,求1-100的和
var sum = 0;
fn(int n) {
sum += n;
if(n == 1) {
return;
}
fn(n - 1);
}
fn(100);
print(sum);
}
7 闭包操作
- 全局变量特点:常驻内存,污染全局。
- 局部变量特点:不常驻内存,支持垃圾机制回收,不污染全局。
- 要想实现常驻内存,又不会污染全局,闭包可以解决这些问题。
- 写法:函数嵌套函数,并return里面的函数,这样就形成了闭包。
- 说明:内部函数调用外部函数的变量或参数,且这些变量或参数不会被系统回收。
main() {
// 闭包
fn() {
var a = 123;
return() {
a++;
print(a);
};
}
var b = fn();
b();
b();
b();
}
8 自执行方法
main() {
// 自执行方法:即不需要调用,自动执行的方法
(() {
print('自执行方法一');
})();
((String n) {
print(n);
})('自执行方法二');
}