文章

函数

函数

函数

函数

定义

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. 局部变量特点:不常驻内存会被垃圾回收机制回收、不会污染全局

闭包特点:常驻内存、不污染全局

闭包定义:返回函数内部变量的函数

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 进行授权