一、函数的基本定义
Dart是一种真正的面向对象语言,所以即使函数也是对象,所以也有类型, 类型就是Function。
这也就意味着函数可以作为变量定义或者作为其他函数的参数或者返回值.
函数的定义方式:
Effective Dart建议对公共的API, 使用类型注解, 但是如果我们省略掉了类型, 依然是可以正常工作的
sum(num1, num2) {
return num1 + num2;
}
另外, 如果函数中只有一个表达式, 那么可以使用箭头语法(arrow syntax)
注意, 这里面只能是一个表达式, 不能是一个语句。 sum(num1, num2) => num1 + num2;
二、函数的参数问题
函数的参数可以分成两类: 必须参数和可选参数
前面使用的参数都是必须参数.
2.1. 可选参数:可选参数可以分为 命名可选参数 和 位置可选参数
定义方式:
命名可选参数: {param1, param2, ...}
位置可选参数: [param1, param2, ...]
命名可选参数的演示:
命名可选参数, 可以指定某个参数是必传的(使用@required, 有问题)
// 命名可选参数的必须
printInfo3(String name, {int age, double height, @required String address}) {
print('name=$name age=$age height=$height address=$address');
}
2.2. 参数默认值
参数可以有默认值, 在不传入的情况下, 使用默认值。注意, 只有可选参数才可以有默认值, 必须参数不能有默认值。
Dart中的main函数就是一个接受可选的列表参数作为参数的, 所以在使用main函数时, 我们可以传入参数, 也可以不传入。
2.3 函数是一等公民
在很多语言中, 函数并不能作为一等公民来使用, 比如Java/OC. 这种限制让编程不够灵活, 所以现代的编程语言基本都支持函数作为一等公民来使用, Dart也支持.
这就意味着你可以将函数赋值给一个变量, 也可以将函数作为另外一个函数的参数或者返回值来使用.
2.4匿名函数的使用
大部分我们定义的函数都会有自己的名字, 比如前面定义的foo、test函数等等。
但是某些情况下,给函数命名太麻烦了,我们可以使用没有名字的函数,这种函数可以被称之为匿名函数( anonymous function),也可以叫lambda或者closure。
2.5词法作用域
dart中的词法有自己明确的作用域范围,它是根据代码的结构({})来决定作用域范围的,优先使用自己作用域中的变量,如果没有找到,则一层层向外查找。
2.6. 词法闭包
闭包可以访问其词法范围内的变量,即使函数在其他地方被使用,也可以正常的访问。
2.7. 返回值问题
所有函数都返回一个值。如果没有指定返回值,则语句返回null;隐式附加到函数体。
网友评论