? 干货分享! 作为一名开发者,函数是我们日常编码中最常用的结构之一。今天就带大家深入了解ArkTS中的函数特性,让你的代码更加优雅高效~
? 函数声明:代码复用的基础
函数声明是ArkTS中定义函数的基本方式,它包含函数名称、参数列表、返回类型和函数体。
function add(x: string, y: string): string {
let z: string = `${x} ${y}`;
return z;
}
✨ 函数声明的关键要素:
- 函数名:用于调用该函数的标识符
- 参数列表:函数接收的输入值,每个参数都需要标注类型
- 返回类型:函数执行后返回值的类型
- 函数体:实现函数功能的代码块
? 参数类型:灵活多样的输入方式
? 基本参数
在ArkTS中,必须为每个参数标记类型,这有助于编译器进行类型检查:
function greet(name: string, age: number): void {
console.info(`Hello, ${name}! You are ${age} years old.`);
}
? 可选参数
有两种方式可以定义可选参数:
1️⃣ 使用问号标记
function hello(name?: string) {
if (name == undefined) {
console.info('Hello!');
} else {
console.info(`Hello, ${name}!`);
}
}
hello(); // 输出: Hello!
hello('Alice'); // 输出: Hello, Alice!
2️⃣ 设置默认值
function multiply(n: number, coeff: number = 2): number {
return n * coeff;
}
multiply(2); // 返回 4 (2*2)
multiply(2, 3); // 返回 6 (2*3)
? Rest参数:处理不定数量的参数
Rest参数允许函数接收不定数量的参数,并将它们作为数组处理:
function sum(...numbers: number[]): number {
let res = 0;
for (let n of numbers)
res += n;
return res;
}
sum(); // 返回 0
sum(1, 2, 3); // 返回 6
sum(10, 20, 30, 40); // 返回 100
? 返回类型:明确函数输出
? 显式返回类型
明确指定函数返回值的类型:
function foo(): string {
return 'foo';
}
? 推断返回类型
如果可以从函数体内推断出返回类型,则可以省略标注:
function goo() {
return 'goo'; // 返回类型被推断为string
}
? void返回类型
不需要返回值的函数可以显式指定为void或省略标注:
function hi1() {
console.info('hi');
}
function hi2(): void {
console.info('hi');
}
? 函数的作用域:变量可见性规则
函数中定义的变量仅在函数内部可见,外部无法访问:
let outerVar = 'I am outer';
function func() {
let outerVar = 'I am inside';
console.info(outerVar); // 输出: I am inside
}
func();
console.info(outerVar); // 输出: I am outer
? 函数调用:让函数发挥作用
调用函数时,实参值会赋值给函数的形参:
function join(x: string, y: string): string {
let z: string = `${x} ${y}`;
return z;
}
let x = join('hello', 'world');
console.info(x); // 输出: hello world
? 函数类型:函数作为值
函数类型通常用于定义回调函数,使代码更加灵活:
// 定义一个接收数值并返回数值的函数类型
type trigFunc = (x: number) => number
function do_action(f: trigFunc) {
let result = f(3.14159);
console.info(`计算结果: ${result}`);
}
// 将Math.sin函数作为参数传入
do_action(Math.sin);
// 也可以传入自定义函数
do_action((x) => x * x);
? 箭头函数:简洁优雅的函数表达式
箭头函数(Lambda函数)提供了更简洁的函数定义方式:
// 标准箭头函数
let sum1 = (x: number, y: number): number => {
return x + y;
}
// 简化版本(单行表达式可以省略return和花括号)
let sum2 = (x: number, y: number) => x + y;
console.info(sum1(5, 3)); // 输出: 8
console.info(sum2(5, 3)); // 输出: 8
? 闭包:捕获外部变量的函数
闭包是由函数及其创建时的环境组合而成,它可以捕获并记住创建时作用域内的变量:
function createCounter(): () => number {
let count = 0;
// 内部函数捕获了count变量
let increment = (): number => {
count++;
return count;
};
return increment;
}
let counter = createCounter();
console.info(counter()); // 输出: 1
console.info(counter()); // 输出: 2
console.info(counter()); // 输出: 3
// 创建新的计数器,count从0开始
let counter2 = createCounter();
console.info(counter2()); // 输出: 1
闭包在实现私有变量、记忆化函数和事件处理等场景中非常有用。
? 函数重载:一个函数,多种调用方式
函数重载允许同一个函数根据不同的参数类型有不同的行为:
// 函数重载声明
function process(x: number): number;
function process(x: string): string;
// 函数实现(必须兼容所有重载签名)
function process(x: number | string): number | string {
if (typeof x === 'number') {
return x * 2; // 处理数字
} else {
return x.toUpperCase(); // 处理字符串
}
}
console.info(process(10)); // 输出: 20
console.info(process('hello')); // 输出: HELLO
⚠️ 注意: 不允许重载函数有相同的名字和参数列表,否则会导致编译错误。
? 实战技巧:函数的最佳实践
- 保持函数简单:每个函数应该只做一件事,并做好这件事
- 合理命名:函数名应该清晰表达其功能
- 参数控制:尽量控制参数数量,通常不超过3个
- 使用类型注解:明确的类型注解可以提高代码可读性和可维护性
- 考虑纯函数:尽可能编写纯函数(相同输入总是产生相同输出,无副作用)
? 函数应用场景
- 数据处理:转换、过滤、聚合数据
- 事件处理:响应用户交互
- API调用:封装网络请求
- 组件复用:提取可复用的逻辑
- 状态管理:管理应用状态变化
? 小结: 函数是ArkTS中最基本也是最强大的构建块之一。掌握了函数的各种特性,你就能写出更加简洁、可维护的代码。希望这篇文章对你有所帮助!
❤️ 如果觉得有用,请点赞收藏,你的支持是我持续创作的动力!
#编程学习 #ArkTS #函数编程 #HarmonyOS #技术干货 #前端开发