跟着坚果派社区从零开始学鸿蒙——ArkTS语言基础-函数全解

? 干货分享! 作为一名开发者,函数是我们日常编码中最常用的结构之一。今天就带大家深入了解ArkTS中的函数特性,让你的代码更加优雅高效~

? 函数声明:代码复用的基础

函数声明是ArkTS中定义函数的基本方式,它包含函数名称、参数列表、返回类型和函数体。

function add(x: string, y: string): string {
  let z: string = `${x} ${y}`;
  return z;
}

✨ 函数声明的关键要素:

  1. 函数名:用于调用该函数的标识符
  2. 参数列表:函数接收的输入值,每个参数都需要标注类型
  3. 返回类型:函数执行后返回值的类型
  4. 函数体:实现函数功能的代码块

? 参数类型:灵活多样的输入方式

? 基本参数

在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

⚠️ 注意: 不允许重载函数有相同的名字和参数列表,否则会导致编译错误。

? 实战技巧:函数的最佳实践

  1. 保持函数简单:每个函数应该只做一件事,并做好这件事
  2. 合理命名:函数名应该清晰表达其功能
  3. 参数控制:尽量控制参数数量,通常不超过3个
  4. 使用类型注解:明确的类型注解可以提高代码可读性和可维护性
  5. 考虑纯函数:尽可能编写纯函数(相同输入总是产生相同输出,无副作用)

? 函数应用场景

  • 数据处理:转换、过滤、聚合数据
  • 事件处理:响应用户交互
  • API调用:封装网络请求
  • 组件复用:提取可复用的逻辑
  • 状态管理:管理应用状态变化

? 小结: 函数是ArkTS中最基本也是最强大的构建块之一。掌握了函数的各种特性,你就能写出更加简洁、可维护的代码。希望这篇文章对你有所帮助!

❤️ 如果觉得有用,请点赞收藏,你的支持是我持续创作的动力!

#编程学习 #ArkTS #函数编程 #HarmonyOS #技术干货 #前端开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红目香薰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值