ArkTS 函数进阶:箭头函数、回调、闭包与重载全解析
引言
在掌握 ArkTS 函数基础声明与用法的基础上,本节课将进一步学习函数相关的进阶知识点,包括箭头函数(Lambda 表达式)、函数类型、回调函数、闭包函数与函数重载的语法规则与开发场景,帮助开发者提升函数使用能力,应对更复杂的开发需求。
核心内容
函数基础声明回顾
函数是将多条语句组合在一起、用于实现特定功能或完成特定任务的可重用代码块。通过function关键字声明,需要向编译器说明四部分核心信息:函数名、返回类型、参数列表和函数体。
基础语法:
function 函数名(参数列表): 返回类型 { 函数体 }示例:
function makeMilkTea(flavor: string, sweetness: string): string { return `一杯${sweetness}的${flavor}奶茶`; }箭头函数(Lambda 表达式)
箭头函数的核心作用是简化函数定义的语法形式,提升代码简洁性。它常用于快速编写简短函数,尤其适合作为参数传入其他函数(如循环、判断中的小逻辑)。
基础语法:
(参数列表): 返回类型 => { 函数体 }完整写法示例:
(flavor: string, sweetness: string): string => { return `一杯${sweetness}的${flavor}奶茶`; }简化写法规则:
如果编译器可自动识别返回值类型,返回值类型可以省略。
如果函数体仅包含一行代码,可以省略花括号,该行代码的结果会自动作为返回值,无需手动写
return。
简化后示例:
(flavor: string, sweetness: string): string => `一杯${sweetness}的${flavor}奶茶`;调用方式:箭头函数属于匿名函数,需要将其赋值给变量后才能调用。
函数类型
函数类型是用于约束函数参数类型和返回值类型的数据类型,适用于把函数赋值给变量、或作为参数传给其他函数的场景,可以避免写错参数/返回值类型,让代码更规范。
基础语法:使用type关键字定义函数类型别名。
type 函数类型别名 = (param1: 类型1, param2: 类型2) => 返回值类型;完整示例:
// 声明函数类型 type MilkTeaMaker = (flavor: string, sweetness: string) => string; // 将箭头函数赋值给变量 const makeMilkTea: MilkTeaMaker = (flavor: string, sweetness: string): string => `一杯${sweetness}的${flavor}奶茶`;基于编译器的自动类型推断,函数类型声明可以省略,直接定义变量即可:
const makeMilkTea = (flavor: string, sweetness: string): string => `一杯${sweetness}的${flavor}奶茶`; // 调用示例 console.log(makeMilkTea('巧克力', '半糖')); // 输出: 一杯半糖的巧克力奶茶 console.log(makeMilkTea('草莓', '微糖')); // 输出: 一杯微糖的草莓奶茶回调函数
回调函数的核心概念是:把一个函数当成参数传给另一个函数,接收参数的函数在特定时机或条件下执行这个传入的函数。
回调函数非常适配"一个函数完成核心逻辑后,自动执行一段可灵活替换的自定义逻辑"的场景。
示例代码:
// 定义接收回调参数的主函数 function makeMilkTeaCallback(baseFlavor: string, callback: () => void): void { console.log(`${baseFlavor}奶茶已出杯`); // 制作完成后,执行回调 — 添加自定义配料 callback(); } // 写法1:先定义箭头函数变量,再传入 const addOther = () => { console.log('加入布丁'); }; makeMilkTeaCallback('草莓', addOther); // 输出: // 草莓奶茶已出杯 // 加入布丁 // 写法2:调用时直接传入箭头函数,更简洁 makeMilkTeaCallback('草莓', () => { console.log('加入珍珠'); console.log('打包'); }); // 输出: // 草莓奶茶已出杯 // 加入珍珠 // 打包闭包函数
闭包函数是由函数及声明该函数的环境组合而成的,该环境包含了这个闭包创建时作用域内的任何局部变量。闭包适用于需要让函数记住并保留自己定义时的变量(比如计数),即使函数在其他地方被调用的场景。
结构逻辑:闭包 = 外部函数{变量 -> 内部函数}
实现示例(计数器):
function createCounter() { let count = 0; // 外层函数定义局部变量存储计数 return () => { // 返回内部箭头函数 count++; return count; }; } // 调用外层函数拿到闭包 const counter = createCounter(); console.log(counter()); // 输出 1 console.log(counter()); // 输出 2核心原理:内部函数会保留外层函数的局部变量引用,即使外层函数已经执行完毕,这些变量也不会被销毁,内部函数仍然可以访问和修改这些变量。
函数重载
函数重载是一种允许开发者通过不同参数类型或数量定义同名函数的机制,可以解决同一操作处理不同参数的需求,让函数使用更灵活。
使用规则:
第一步:先声明多个无函数体的重载签名,参数列表必须不同(参数类型不同/参数数量不同/参数顺序不同均可)。如果两个重载的函数名和参数列表完全一致,会引发编译错误。
第二步:编写一个兼容所有重载签名的统一实现函数,完成具体逻辑。
第三步:和普通函数一样调用,编译器会自动根据传入参数匹配对应的重载规则。
示例代码:
// 第一步:定义重载规则 function printInfo(value: string): void; // 规则1:接收字符串,打印文字 function printInfo(value: number): void; // 规则2:接收数字,打印数字说明 // 第二步:实现兼容所有规则的函数 function printInfo(value: string | number): void { // 通过 if-else 判断参数类型,执行对应逻辑 if (typeof value === 'string') { console.log('文字信息: ', value); } else { console.log('数字信息: 这个数字是: ', value); } } // 第三步:调用 printInfo('Hello ArkTS'); // 匹配规则1,输出:文字信息: Hello ArkTS printInfo(100); // 匹配规则2,输出:数字信息: 这个数字是: 100总结
本节课围绕 ArkTS 函数进阶展开,涵盖以下核心内容:
函数基础声明回顾:通过
function关键字声明,需明确函数名、返回类型、参数列表和函数体四部分信息。箭头函数(Lambda 表达式):简化函数定义的语法形式。若编译器可自动识别返回值类型则可省略类型标注;若函数体仅包含一行代码,可省略花括号和
return,结果自动作为返回值。函数类型:使用
type关键字定义函数类型别名,用于约束函数参数和返回值类型,支持函数赋值给变量或作为参数传递。回调函数:将函数作为参数传入另一个函数,在特定时机执行。适用于主函数完成核心逻辑后自动执行可灵活替换的自定义逻辑。
闭包函数:函数与其声明时所在作用域环境的组合,可保留外层函数的局部变量状态。即使外层函数执行完毕,变量也不会被销毁。
函数重载:允许同名函数定义不同参数规则。需先声明多个无函数体的重载签名(参数列表必须不同),再编写一个兼容所有签名的统一实现函数。
