ArkTS函数通关指南:从入门到实战,12年程序员带你吃透“代码菜谱”
大家好,我是深耕嵌入式、鸿蒙、AI及Java领域12年的程序员Feri,带过团队创过业,一直专注于程序员成长这件事~ 函数作为编程的核心工具,就像做菜的“万能菜谱”,学好它能让你的代码更简洁、复用率更高。今天就用最通俗的方式,带大家搞定ArkTS的函数,成长路上一起加油,君志所向,一往无前!
一、先搞懂:函数到底是什么?
函数本质就是一段“封装好的可重复代码”,像一份详细的菜谱:
- 菜谱告诉你“需要什么食材(参数)”“怎么做(函数实现)”“最后做出什么菜(返回值)”;
- 函数则告诉计算机“需要什么输入(参数)”“执行什么逻辑(函数体)”“最后返回什么结果(返回值)”。
它的核心作用就一个:避免重复写代码。比如“计算两个数相加”“判断闰年”这些常用逻辑,封装成函数后,想用就调,不用反复复制粘贴。
二、ArkTS函数语法:格式要记牢(强类型是关键)
ArkTS是强类型语言,参数和返回值必须明确指定类型(比如number、string、boolean),语法格式如下:
function 函数名(参数名: 数据类型, ...): 返回值类型 {
函数逻辑实现;
return 返回值; // 若返回值类型为void,可省略return
}
拆解成三个核心部分,一看就懂:
- 函数名:给函数起个好记的名字,比如“addNumbers”“isLeapYear”,见名知意;
- 参数:输入的“食材”,要指定类型(比如number表示数字、string表示字符串);
- 返回值:输出的“成品”,也要指定类型,若没有返回值则用“void”。
三、四种常用函数定义:覆盖所有场景
就像菜谱分“快手菜”“硬菜”,函数也分四种核心类型,每个类型都有对应的实用场景,直接上代码+说明:
1. 无参无返回值(“不用食材,直接出菜”)
场景:不需要输入,只执行固定逻辑(比如打印随机数)
// 无参无返回值:返回值类型可省略,默认void
function printLuckyNumber() {
// 生成0-9的随机整数
const luckyNum = Math.floor(Math.random() * 10);
console.log(`你的幸运数字:${luckyNum}`);
}
2. 有参无返回值(“给食材,做了直接吃”)
场景:需要输入参数,执行逻辑后不返回结果(比如判断闰年并打印)
// 有参无返回值:参数year指定为number类型,返回值void
function checkLeapYear(year: number) {
// 闰年规则:4年一闰,百年不闰,四百年再闰
const isLeap = (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
console.log(`${year}年是${isLeap ? '闰年' : '平年'}`);
}
3. 无参有返回值(“不用食材,做出菜打包带走”)
场景:不需要输入,执行后返回结果(比如随机推荐午餐)
// 无参有返回值:指定返回值类型为string
function randomLunch(): string {
const lunches = ["快餐", "牛肉面", "包子", "肯德基"];
// 随机取一个午餐
const randomIndex = Math.floor(Math.random() * lunches.length);
return lunches[randomIndex];
}
4. 有参有返回值(“给食材,做出菜打包带走”)
场景:需要输入参数,执行后返回结果(比如根据名字推荐午餐)
// 有参有返回值:参数name为string,返回值也为string
function recommendLunch(name: string): string {
const lunch = randomLunch(); // 调用上面的无参有返回值函数
return `${name}中午应该吃:${lunch}`;
}
四、函数调用:“菜谱做好了,怎么用?”
定义好函数后,调用就像“按菜谱做菜”,直接写函数名+传参(无参则空括号),测试用例安排上:
it("函数调用测试", 0, () => {
// 1. 调用无参无返回值函数
printLuckyNumber();
// 2. 调用有参无返回值函数:传入实际参数2025
checkLeapYear(2025);
// 3. 调用无参有返回值函数:接收返回结果并打印
const todayLunch = randomLunch();
console.log("今日随机午餐:", todayLunch);
// 4. 调用有参有返回值函数:传入名字,接收结果并打印
const feriLunch = recommendLunch("Feri");
console.log(feriLunch);
// 额外测试:质数判断函数(后面练习会讲)
console.log("3是否为质数:", isPrime(3));
console.log("10是否为质数:", isPrime(10));
});
五、实战练习:动手实现“质数判断函数”
光看不用假把式,来个小挑战:实现一个函数,接收一个数字参数,判断它是否为质数(只能被1和自身整除的大于1的整数)
// 有参有返回值:参数num为number,返回值为boolean
function isPrime(num: number): boolean {
// 边界条件:小于等于1的数不是质数
if (num <= 1) return false;
// 优化:只需判断到num的平方根(减少循环次数)
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) return false; // 能被其他数整除,不是质数
}
return true; // 循环结束没找到除数,是质数
}
小贴士:这里加了“循环到平方根”的优化,比原代码效率更高,编程时要记得兼顾正确性和性能~
六、参数的3个实用特性:让函数更灵活
就像菜谱可以“选加配料”“多加配料”,ArkTS的函数参数也有三个超实用特性,覆盖更多场景:
1. 形参 vs 实参(“菜谱配料” vs “实际食材”)
- 形参:函数定义时写的参数(比如
checkLeapYear(year: number)中的year),是“菜谱上的配料名称”; - 实参:函数调用时传的参数(比如
checkLeapYear(2025)中的2025),是“实际准备的食材”; - 核心原则:实参类型要和形参类型一致,不然会报错(强类型语言的优势,避免类型混乱)。
2. 可选参数(“可选配料,可加可不加”)
场景:有些参数不是必填的,比如“打招呼时可以说名字,也可以不说”
- 语法:参数名后加
?,必须放在最后一个参数位置; - 注意:没传可选参数时,它的默认值是
undefined。
// 可选参数name:可传可不传
function sayHello(name?: string) {
const msg = name ? `${name} is a good man!` : "You are a good man!";
console.log(msg);
}
// 两种调用方式都合法
sayHello(); // 输出:You are a good man!
sayHello("Tom"); // 输出:Tom is a good man!
3. 剩余参数(“不限量配料,想加多少加多少”)
场景:参数数量不确定,比如“统计一个人的多个爱好”
- 语法:用
...开头,参数类型必须是数组(比如string[]),必须放在最后一个参数位置; - 特点:调用时可传0个、1个或多个参数,函数内部会把它们当成数组处理。
// 剩余参数hobbies:收集所有传入的爱好,类型为string[]
function showHobbies(name: string, ...hobbies: string[]) {
console.log(`${name}的爱好有:${hobbies.length ? hobbies.join("、") : "暂无"}`);
}
// 三种调用方式都合法
showHobbies("Feri"); // 输出:Feri的爱好有:暂无
showHobbies("Feri", "编程"); // 输出:Feri的爱好有:编程
showHobbies("Feri", "编程", "跑步", "看电影"); // 输出:Feri的爱好有:编程、跑步、看电影
七、箭头函数:简洁到飞起的“快捷菜谱”
箭头函数是普通函数的简化写法,语法更灵活,尤其适合短小的函数,核心特点是“简洁+this不迷路”。
1. 基础语法(三种常见形式)
// 1. 无参无返回值
const func1 = () => console.log("箭头函数:无参无返回值");
// 2. 单参无返回值(参数括号可省略)
const func2 = name => console.log(`Hello, ${name}`);
// 3. 有参有返回值(函数体只有一行时,可省略大括号和return)
const add = (a: number, b: number) => a + b;
// 4. 函数体多行(需加大括号和return)
const multiply = (a: number, b: number) => {
const result = a * b;
return result;
};
2. 核心优势:this不“跑偏”
这是箭头函数最关键的特点,普通函数的this像“变色龙”(由调用方式决定),而箭头函数的this是“定向导航”(继承自外层作用域):
- 普通函数:在回调、事件处理中容易出现
this指向错误; - 箭头函数:在ArkUI的事件处理(如按钮点击)、数组方法(如map、filter)中,能确保
this指向当前组件或外层作用域,不用写const that = this这种冗余代码。
3. 注意点:两个“没有”
- 没有自己的
arguments对象:若需要获取所有参数,用剩余参数...args替代; - 不能当构造函数:不能用
new关键字调用箭头函数。
4. 适用场景(鸿蒙开发中高频使用)
- 数组方法回调:
const numbers = [1,2,3].map(num => num * 2);(简洁高效); - 事件处理:ArkUI中按钮点击事件
Button("点击").onClick(() => this.handleClick())(确保this指向正确); - 短小逻辑函数:比如简单的计算、数据转换,用箭头函数减少代码量。
八、总结:函数学习核心要点
- 核心作用:封装逻辑、重复使用,让代码更简洁、易维护;
- 语法关键:ArkTS是强类型,参数和返回值必须指定类型;
- 灵活用法:可选参数、剩余参数适配不同场景,箭头函数简化代码+解决this问题;
- 实战技巧:函数名见名知意,逻辑尽量单一(一个函数只做一件事),便于调试和复用。
如果大家想考取鸿蒙开发者认证的,欢迎加入我的专属考试链接中:developer.huawei.com/consumer/cn…
函数是编程的基础,也是鸿蒙开发中构建界面逻辑、处理事件的核心工具。把这篇指南里的例子动手敲一遍,再结合自己的需求写几个函数,很快就能熟练掌握~加油呀!