一、内置方法
print…
二、自定义方法
2.1 函数的定义
小驼峰命名规则 方法的返回值不知道可不写;知道的话建议进行约束。而不是依靠推断。
void printInfo() {
print('自定义无返回值函数');
}
int getAge(int age) {
return age;
}
void main() {}
2.2 可选参数 & 默认参数
[…] 可选 可选内部赋值代表是默认参数,必传参数不能赋默认值; 默认参数一般在最后…
String getAge(String name, [int? age, String? sex='男']) {
return age!=null ? '$name - $age - $sex' : '$name - $sex';
}
2.3 命名(具名)参数
String getAge(String name, {int? age, String? sex='男'}) {
return age!=null ? '$name - $age - $sex' : '$name - $sex';
}
// 调用时指定名称 `名称:value`
getAge('hao', age:18);
2.4 箭头参数
使用条件:函数体只有一句话
list.forEach((element){
print(element);
});
list.forEach((element) => print(element));
2.5 匿名函数
直接用var声明报警告: 无法推断函数literal的类型,因为该literal的主体是块。 尝试向变量添加显式类型。
Function fn = () {
print('匿名函数赋值给一个变量');
};
2.6 自执行方法
不支持一元运算符
// 不包裹函数体
(){
print('我是自执行方法!');
}();
// 包裹函数体
((){
print('我是自执行方法!');
})();
2.7 递归
自己调用自己;但必须给定退出条件
var sum = 1;
fn(int n) {
sum *= n;
if(n == 1) {
return;
}
fn(n - 1);
}
fn(5); // 计算5的阶乘
print(sum);
2.7 闭包
- 全局变量:常驻内存,会污染全局
- 局部变量:不常驻内存会被垃圾回收机制回收,不会污染全局
闭包:常驻内存且不会污染全局
区分全局和局部的概念
var a = 1;
void main(List<String> args) {
void fn() {
var b = 2;
a++;
b++;
print('$a - $b');
}
fn();// 2 - 3
fn();// 3 - 3
}
闭包
Function bibao() {
var c = 123;
return () {
c++;
print(c);
};
}
var d = bibao();
d();// 124
d();// 125
d();// 126