函数
函数
函数
函数
定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 全局方法
void printInfo() {
print('hello');
}
// 调用 - 入口方法内
void main() {
printInfo();
int getNum() {
var num = 10;
return num;
}
var n = getNum();
print(n); // 10
}
调用方法传参
求1到这个数的所有数的和
1
2
3
4
5
6
7
8
9
10
int getSum(int n) {
int sum = 0;
for(var i = 0; i <= n; i++) {
sum += i;
}
return sum;
}
var n = getSum(10);
print(n); // 55
打印用户信息的方法
1
2
3
4
5
6
String getUserInfo(String name, int age) { // 形参
return '姓名:$name -- 年龄:$age';
}
var str = getUserInfo('张三', 20);
print(str); // 姓名:张三 -- 年龄:20
可选参数
1
2
3
4
5
6
7
8
9
10
11
12
String getUserInfo(String name, [age]) { // 形参
if (age != null) {
return '姓名:$name -- 年龄:$age';
}
return '姓名:$name -- 年龄:保密';
}
var str1 = getUserInfo('张三', 20);
print(str1); // 姓名:张三 -- 年龄:20
var str2 = getUserInfo('张三');
print(str2); // 姓名:张三 -- 年龄:保密
默认参数
1
2
3
4
5
6
7
8
9
10
11
12
String getUserInfo(String name, [sex = '男', age]) { // 形参
if (age != null) {
return '姓名:$name -- 性别:$sex -- 年龄:$age';
}
return '姓名:$name -- 性别:$sex -- 年龄:保密';
}
var str1 = getUserInfo('张三');
print(str1); // 姓名:张三 -- 性别:男 -- 年龄:保密
var str2 = getUserInfo('张三', '女');
print(str2); // 姓名:张三 -- 性别:女 -- 年龄:保密
命名参数
1
2
3
4
5
6
7
8
9
10
11
12
String getUserInfo(String name, {int age, String sex = '男'}) { // 形参
if (age != null) {
return '姓名:$name -- 性别:$sex -- 年龄:$age';
}
return '姓名:$name -- 性别:$sex -- 年龄:保密';
}
var str1 = getUserInfo('张三', age: 20);
print(str1); // 姓名:张三 -- 性别:男 -- 年龄:20
var str2 = getUserInfo('张三', age: 20, sex: '女');
print(str2); // 姓名:张三 -- 性别:女 -- 年龄:20
把方法当作参数
1
2
3
4
5
6
7
8
9
void fn1() {
print('hello');
}
fn2(fn) {
fn();
}
fn2(fn1);
箭头函数
1
2
3
4
5
6
List list = ['张三', '李四', '王五'];
list.forEach((value) => print(value));
list.forEach((value) => {
print(value) // 这里不能要分号
});
需求:修改下面List里面的数据 让数组中大于2的值乘以2
1
2
3
4
5
6
7
8
9
10
11
12
13
List list = [1, 2, 3, 4];
var newList = list.map((val) {
if (val > 2) {
return val * 2;
}
return val;
});
print(newList.toList()); // [1, 2, 6, 8]
// 箭头函数实现
List list = [1, 2, 3, 4];
var newList = list.map((val) => val > 2 ? val * 2 : val);
print(newList.toList()); // [1, 2, 6, 8]
匿名函数
1
2
3
4
5
var getNum = (int n) {
print(n);
};
getNum(3); // 3
自执行函数
1
2
3
4
((int n) {
print('我是自执行方法'); // 我是自执行方法
print(n); // 12
})(12);
方法的递归
n 的阶乘
1
2
3
4
5
6
7
8
9
10
11
var sum = 1;
fn(int n) {
sum *= n;
if (n == 1) {
return;
}
fn(n - 1);
}
fn(5);
print(sum); // 120
求和
1
2
3
4
5
6
7
8
9
10
11
var sum = 0;
fn(int n) {
sum += n;
if (n == 0) {
return;
}
fn(n - 1);
}
fn(10);
print(sum); // 55
闭包
- 全局变量特点:常驻内存,污染全局
- 局部变量特点:不常驻内存会被垃圾回收机制回收、不会污染全局
闭包特点:常驻内存、不污染全局
闭包定义:返回函数内部变量的函数
1
2
3
4
5
6
7
8
9
10
11
12
fn() {
var a = 123;
return () {
a++;
print(a);
};
}
var b = fn();
b(); // 124
b(); // 125
b(); // 126
本文由作者按照 CC BY 4.0 进行授权