前面主要讲了Dart的一些基础用法,今天主要讲解Dart的函数部分。
一、Dart函数概述
1、Dart是一门面向对象的语言,而且是完全面向对象的。所谓的完全面向对象就是函数也是对象,函数可以被声明成变量,函数也可以作为另外一个函数的参数使用,同时也可以像调用函数一样调用类的实例变量,函数这些特性和JavaScript中函数第一等公民很像。
2、和其他语言不太一样的是,Dart所有的函数都有返回值,如果没有指明返回值,函数返回null;会默认的拼接到函数体。
3、Dart中的函数如果只有一行表达式的,可以使用尖头语法简写
4、函数有两种参数类型:规定参数和可选参数。先列出规定参数,可选参数跟随其后。命名成可选的参数也可以被标记为规定参数。
二、函数的种类和定义
1、系统内置函数
比如print()'
2、自定义函数
自定义函数的基本格式:
返回类型 函数名称(函数参数1,函数参数2,...){
函数体
return 返回值;
void printData(){
print('我是一个自定义函数');
}
printData();
3、可选参数的函数
在函数参数中用[]符号包裹可选的参数
String printUserInfo(String username,[String sex='男',int age]){ //形式参数
if(age!=null){
return "姓名:$username---性别:$sex--年龄:$age";
}
return "姓名:$username---性别:$sex--年龄保密";
}
print(printUserInfo('张三'));
print(printUserInfo('小李','女'));
print(printUserInfo('小李','女',30));
4、带默认参数的函数
可以使用=来指明参数的默认值。默认值必须是编译时常量。如果没有默认值,默认值就是null。
String printUserInfo(String username,{int age,String sex='男'}){ //形式参数
if(age!=null){
return "姓名:$username---性别:$sex--年龄:$age";
}
return "姓名:$username---性别:$sex--年龄保密";
}
print(printUserInfo('张三',age:20,sex:'未知'));
5、命名参数的函数
定义函数的时候使用{param1, param2, …}来明确参数
//函数1
func1(){
print('func1');
}
//函数2
func2(func){
func();
}
//调用func2这个函数 把func1这个函数当做参数传入
func2(func1);
6、函数作为参数的函数
var fn=(){
print('我是一个匿名函数');
};
fn();
7、匿名函数
Dart也可以创建匿名函数,可以给一个变量赋值一个匿名函数。匿名函数看起来像一个有名称的函数零个或多个参数在圆括号中用逗号或中括号分隔,代码块在函数体后边。
list.forEach((value){
print(value);
});
list.forEach((value)=>print(value));
list.forEach((value)=>{
print(value)
});
8、箭头函数
((int n){
print(n);
print('我是自执行方法');
})(12);
9、自执行函数
var sum = 1;
func(n){
sum*=n;
if(n==1){
return ;
}
func(n-1);
}
func(5);
print(sum);
10、递归函数
var sum = 1;
func(n){
sum*=n;
if(n==1){
return ;
}
func(n-1);
}
func(5);
print(sum);
11、main函数
每个app必须有一个顶级的main()函数,提供程序的入口。main()函数返回void类型并且有一个list类型的可选参数。
void main() {
}
三、全局变量、局部变量和闭包
Dart是一个静态作用域的语言,意味着变量的作用域是在写代码的时候就提前定义好的。可以看一个函数是否在花括号里边来看它的作用域,比如全局变量或者局部变量。
1、全局变量
特点: 全局变量常驻内存、全局变量污染全局
var data = 123;
void main(){
print(a);
func(){
data++;
print(data);
}
func();
}
2、局部变量
特点:不常驻内存会被垃圾机制回收、不会污染全局
var data = 123;
void main(){
print(a);
func(){
data++;
print(data);
}
func();
func();
printData(){
var myData=123;
myData++;
print(myData);
}
printData();
printData();
}
3、闭包
背景:
为了实现这个需求,产生了闭包。
闭包: 函数嵌套函数, 内部函数会调用外部函数的变量或参数, 变量或参数不会被系统回收(不会释放内存)
闭包的写法: 函数嵌套函数,并return 里面的函数,这样就形成了闭包。
func(){
var data = 123; /*不会污染全局 常驻内存*/
return(){
data++;
print(a);
};
}
var b=func();
b();
b();
b();