持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
匿名函数
函数表达式创建的函数叫做匿名函数,通常也说没有名字的函数叫做匿名函数
匿名函数的定义方式:
(参数列表){
函数体
return 返回值
}
//普通函数
show(param1, param2) {
print("$param1 $param2");
}
show("hello", "world");
//匿名函数
var show1 = (param1, param2) {
print("$param1 $param2");
};
show1("hello", "world");
匿名函数多被用于参数进行传递
-
示例一
定义一个函数
show,要求传入一个函数void show(Function fun) { fun(); }函数调用
void main(List<String> args) { var test = () => {print("函数作为参数")}; show(test); // 也可以简写为: show(() => { print("函数作为参数") }); }在实际开发中,匿名函数作为参数进行传递,往往不会按照示例一中
show函数的方式定义。在示例一中,只是说明了参数是Function类型,但并没有明确说明这个Function类型的函数是否有参数、是否有返回值,所以,示例一的定义方式不推荐 -
示例二
定义一个函数
show,要求传入一个函数。该函数有返回值和参数,返回值是String类型,函数名称是fun,函数参数是namevoid show(String fun(String name)) { var result = fun("dart"); print(result); }函数调用
void main(List<String> args) { var test = (String name) { return name; }; show(test); // 也可以简写为: // 使用箭头函数,=> name 是 {return name} 的简写 show((name) => name); }在示例二中,虽然明确了函数
show的参数格式,但是代码量大,不方便阅读 -
示例三
定义一个函数
show,要求传入一个函数。使用关键字typedef给传入的参数定义一个别名,别名为ShowName,这样写会提高代码的阅读性typedef ShowName = String Function(String name); void show(ShowName showName) { var result = showName("dart"); print(result); }函数调用
void main(List<String> args) { var test = (String name) { return name; }; show(test); // 也可以简写为: // 使用箭头函数,=> name 是 {return name} 的简写 show((name) => name); }
闭包
- 闭包是一个方法(对象)
- 闭包定义在其他方法内部
- 闭包能够访问外部方法内的局部变量,并持有其状态(这是闭包最大的作用,可以通过闭包的方式,将其暴露出去,提供给外部访问)
main() {
//获取闭包
var add = makeAdder(2);
//执行闭包
var value = add(3);
print(value); // 5
}
Function makeAdder(num addBy) {
// 内部声明一个函数 : 闭包
sum(num i) {
// 内部可以访问外部方法内的局部变量 addBy
return i + addBy;
}
// 返回闭包
return sum;
}