目录
函数是可读,可维护和可重用代码的构建块。函数是一组用于执行特定任务的语句。函数将程序组织成逻辑代码块。一旦定义,就可以调用函数来访问代码。这使得代码可以重用。此外,函数可以轻松读取和维护程序的代码。
函数声明告诉编译器函数的名称,返回类型和参数。函数定义提供函数的实际主体。
定义函数
函数定义指定特定任务的执行方式和方式。在使用函数之前,必须先定义它。定义标准函数的语法如下:
function_name() {
//statements
}
或
void function_name() {
//statements
}
该 void
关键字表明函数没有任何值返回给调用者。
例
test() {
//function definition
print("function called");
}
函数调用
必须调用函数才能执行它。此过程称为 函数调用 。
语法
function_name()
以下示例说明了如何调用函数:
void main() {
test();
}
test() {
//function definition
print("function called");
}
它将产生以下输出:
function called
返回函数
函数也可以将值与控件一起返回给调用者。这些函数称为 返回函数 。
语法
return_type function_name(){
//statements
return value;
}
1)该
return_type
可以是任何有效的数据类型。
2)在return
语句是可选的,没有指定函数则返回null
。
3)返回值的数据类型必须与函数的返回类型匹配。
4)函数最多可以返回一个值。换句话说,每个函数只能有一个return
语句。
例
让我们举个例子来了解 返回函数的 工作原理:
1)该示例声明了一个函数 test() ,函数的返回类型是字符串。
2)该函数返回一个字符串值给调用者。这是通过return语句实现的。
3)函数 test() 返回一个字符串。这显示为输出。
void main() {
print(test());
}
String test() {
// function definition
return "hello world";
}
它将产生以下输出:
hello world
函数参数
当函数执行时不需要强制传递参数时,可以使用可选参数。通过在其名称后 附加问号,可以将参数标记为可选。可选参数应设置为函数中的 最后一个参数。
函数可选位置参数
要指定可选的位置参数,请使用[]
括号。
语法
void function_name(param1, [optional_param_1, optional_param_2]) { }
如果可选参数未传递值,则将其设置为NULL。
例
void main() {
test_param(123);
}
test_param(n1,[s1]) {
print(n1);
print(s1);
}
它应该产生以下输出
123
null
函数可选命名参数
与位置参数不同,必须在传递值时指定参数名称。{}
可用于指定可选的命名参数。
语法 - 声明函数
void function_name(a, {optional_param1, optional_param2}) { }
语法 - 调用函数
function_name(optional_param:value,…);
例
void main() {
namedAndOptionalParameters("123");
namedAndOptionalParameters("parameter_n1", s1: "parameter_s1");
namedAndOptionalParameters("parameter_n1", s1: "parameter_s1", s2: "parameter_s2");
}
void namedAndOptionalParameters(n1,{s1,s2}){
print("n1:${(n1)}, s1:${(s1)}, s2:${(s2)}");
}
它应该产生以下输出:
n1:123, s1:null, s2:null
n1:parameter_n1, s1:parameter_s1, s2:null
n1:parameter_n1, s1:parameter_s1, s2:parameter_s2
函数带有默认值的可选参数
默认情况下,还可以为函数参数指定值。但是,这些参数也可以显式传递值。
语法
function_name(param1,{param2= default_value}) {
//......
}
例
void main() {
defaultValueOptional(5);
defaultValueOptional(5, s1: 15);
}
void defaultValueOptional(p1,{s1:10}){
print("p1:${(p1)}, s1:${(s1)}");
}
它应该返回以下输出:
p1:5, s1:10
p1:5, s1:15
递归
递归是一种通过对函数自身重复调用直到它到达结果来迭代操作的技术。当您需要使用循环内的不同参数重复调用相同的函数时,最好应用递归。
例
void main() {
factorial(6);
}
int factorial(number) {
print("number:${(number)}");
if(number <= 0){
return 1;
}else {
int result = number * factorial(number - 1);
print("number:${(number)}, result: ${(result)}");
return result;
}
}
输出结果
number:6
number:5
number:4
number:3
number:2
number:1
number:0
number:1, result: 1
number:2, result: 2
number:3, result: 6
number:4, result: 24
number:5, result: 120
number:6, result: 720
Lambda函数
Lambda函数是表示函数的简明机制,这些函数也称为箭头函数
。
语法
[return_type]function_name(parameters)=>expression;
例
var fruitsList = ['apples', 'bananas', 'oranges'];
fruitsList.forEach((element) => print("${(fruitsList.indexOf(element))} - ${(element)}"));
输出
0 - apples
1 - bananas
2 - oranges
闭包
1)闭包是一个方法(对象)
2)闭包定义在其他方法内部
3)闭包能够访问外部方法内的局部变量,并持有其状态(这是闭包最大的作用,可以通过闭包的方式,将其暴露出去,提供给外部访问)
void anonymousFunction() {
var add2 = makeAdder(2, 'aaa');
var add4 = makeAdder(4, 'bbb');
print(add2(3)); // 5 aaa
print(add4(3)); // 7 bbb
}
Function makeAdder(int addBy, String name) {
return (int i) => '${addBy + i} $name';
}
输出
5 aaa
7 bbb