# 11.函数
# 1.方法的定义 变量 方法的作用域
/**
* 内置方法/函数
* print()
*
* 自定义方法:
* 自定义方法的基本格式:
*
* 返回类型 方法名称 (参数1, 参数2,...) {
* 方法体
* return 返回值;
* }
*/
void printInfo() {
print('我是一个自定义方法');
}
int getNum() {
var myNum=123;
return myNum;
}
void main() {
printInfo();
print(getNum());
// 演示方法的作用域
void xxx() {
aaa() {
print('aaa');
}
aaa();
}
xxx();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 2.方法传参, 默认参数, 可选参数
- 命名参数和可选参数不能同时存在
# 1).方法传参
// 定义一个方法,求1到这个数的所有数的和
int sumNum(int n) {
var sum=0;
for(var i = 1; i<=n;i++) {
sum+=i;
}
return sum;
}
print(sumNum(60));
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2).可选参数
String printUser(String username, [int age]) {
if(age != null) {
return "姓名: $username--- 年龄:$age";
}
return "姓名: $username";
}
print(printUser('星城')); // 姓名: 星城
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3).默认参数
String printUsers(String username, [String sex='男', int age]) {
if(age != null) {
return "姓名: $username -- 性别:$sex -- 年龄:$age";
}
return "姓名: $username -- 性别:$sex";
}
print(printUsers('星城','保密')); // 姓名: 星城 -- 性别:保密
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4).命名参数
String printUserFunc(String username, {int age,String sex="男"}) {
if(age != null) {
return "姓名: $username -- 性别:$sex -- 年龄:$age";
}
return "姓名: $username -- 性别:$sex";
}
print(printUserFunc('星城',age:20)); // 姓名: 星城 -- 性别:男 -- 年龄:20
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 5).实现一个 把方法当作参数的方法
// 方法
fn1() {
print('fn1');
}
// 方法
fn2(fn) {
fn();
}
// 调用fn2这个方法, 把fn1这个方法当做参数传入
fn2(fn1);
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 3.箭头函数, 函数的相互调用
# 1).箭头函数
List list = ['苹果', '香蕉', '西瓜'];
list.forEach((value) => print(value));
1
2
3
2
3
# 2).函数的相互调用
/**
* 需求: 1.定义一个方法isEvenNumber来判断一个数是否是偶数
* 2.定义一个方法打印1-n以内的所有偶数
*/
// 1.定义一个方法isEvenNumber来判断一个数是否是偶数
bool isEvenNumber(int n) {
if(n%2==0) {
return true;
}
return false;
}
// 2.定义一个方法打印1-n以内的所有偶数
printNum(int n) {
for(var i=1;i<=n;i++) {
if(isEvenNumber(i)) {
print(i);
}
}
}
printNum(10); // 2 4 6 8 10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 4.匿名方法,自执行方法, 方法的传递
# 1).匿名方法
// 匿名方法
var printNum = () {
print(123);
};
printNum();
1
2
3
4
5
6
2
3
4
5
6
# 2).自执行方法
// 自执行方法
(
() {
print('我是自执行方法');
}
)();
1
2
3
4
5
6
2
3
4
5
6
# 3).方法的传递
// 通过方法的递归, 求1-100的和
var number=0;
fnnc(int n) {
number+=n;
if(n==0) {
return;
}
fnnc(n-1);
}
fnnc(100);
print(number);
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 5.闭包
/**
* 闭包
* 1.全局变量特点: 全局变量常驻内存, 全局变量污染全局
* 2.局部变量的特点: 不常驻内存会被垃圾机制回收, 不会污染全局
*
* 想实现的功能:
* 1.常驻内存
* 2.不污染全局
*
* 产生了闭包, 闭包可以解决这个问题.......
*
* 闭包: 函数嵌套函数, 内部函数会调用外部函数的变量或参数, 变量或参数不* 会被回收
*
* 闭包的写法: 函数嵌套函数, 并return 里面的函数, 这样就形成了闭包
*/
void main() {
fn() {
var a = 123; /* 不会污染全局 常驻内存*/
return () {
a++;
print(a);
};
}
var b = fn();
b(); // 124
b(); // 125
b(); // 126
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30