Dart是一种面向对象的语言,所以函数也是对象。这意味着函数可以赋值给变量或作为参数传递给其他函数。
函数声明
数据类型 函数的名称(传参) {
函数体
return 返回值
}
举个例子:
int sum(a1,a2){
return a1+a2;
}
Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic处理。如果函数体只有一个表达式,可以使用简写语法
数据类型 函数的名称(传入参数) => 函数体
上面例子可以简写为
sum(a1,a2)=>a1+a2;
函数作为变量
main(List<String> args) {
myPrint('Hello World');
}
var myPrint = (str){
print(str);
};
函数作为参数传递
main(List<String> args) {
test(sum);
}
test(Function func) {
print(func(1,2));
}
可选参数
可选参数可以分为 命名可选参数 和 位置可选参数。
命名可选参数
命名可选参数是通过命名来区分参数,适用大括号限定。
// 命名可选参数
printAddr(String name, {String city, String country}) {
print('name=$name city=$city country=$country');
}
// printAddr
printAddr('小明'); // name=小明 city=null country=null
printAddr('小明', city: "广州"); // name=小明 city=广州 country=null
printAddr('小明', city: "广州", country: "中国"); // name=小明 city=广州 country=中国
printAddr('小明', country: "中国"); // name=小明 city=null country=中国
位置可选参数
位置可选参数是通过参数位置来区分参数,适用大括号限定,位置可选参数示例:
// 位置可选参数
printAddr(String name, [String city, String country]) {
print('name=$name city=$city country=$country');
}
// printAddr
printAddr('小明'); // name=小明 city=null country=null
printAddr('小明', "广州"); // name=小明 city=广州 country=null
printAddr('小明', "广州", "中国"); // name=小明 city=广州 country=中国
注意,可选参数可以指定默认值:
// 可选参数,带默认值
printAddr(String name, {String city = "广州", String country = "中国"}) {
print('name=$name city=$city country=$country');
}
// 调用printAddr函数
printAddr('小明'); // name=小明 city=广州 country=中国
匿名函数
没有名字的函数,我们称为匿名函数。
main(List<String> args) {
execute(var function) {
function();
}
//1.运行有名字的函数
myPrint(){
print("Hello World");
}
execute(myPrint);
//2.运行匿名函数,方法1
execute(() {
print("Hello World");
});
//3.运行有匿名函数,方法3
execute(() => print("Hello World"));
}
静态作用域
Dart 是静态作用域语言, 基本上大括号里面定义的变量就只能在大括号里面被访问,和 Java 作用域 类似。
var name = 'global';
main(List<String> args) {
// var name = 'main';
void myFunction() {
// var name = 'foo';
print(name);
}
myFunction();
}
词法闭包
一个 闭包 是一个函数对象,不管该对象在何处被调用, 该对象都可以访问其作用域内 的变量。
/// 返回一个函数对象,用于将 [addBy] 加入到函数的参数种
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
main() {
// 定义一个加2的函数对象
var add2 = makeAdder(2);
//print(add2.runtimeType); // (num) => num
// 定义一个加4的函数对象
var add4 = makeAdder(4);
print(add2(3)); //5
print(add4(3)); //7
}
返回值
所有的函数都返回一个值。如果没有指定返回值,则 默认把语句 return null;
作为函数的最后一个语句执行。
参考
http://dart.goodev.org/guides/language/language-tour
https://book.flutterchina.club/chapter1/dart.html