
1. 鸿蒙应用开发中的函数基础函数作为编程语言中最基础也最重要的概念之一在鸿蒙应用开发中扮演着核心角色。对于零基础开发者来说理解函数的本质和正确使用方法是迈向高效开发的第一步。1.1 为什么需要函数在鸿蒙应用开发中函数主要解决三个核心问题代码复用避免重复编写相同逻辑的代码块逻辑封装将特定功能封装成独立单元降低复杂度模块化开发便于团队协作和代码维护以鸿蒙的页面跳转功能为例如果不使用函数每次跳转都需要重复编写相同的Intent设置代码而通过函数封装后只需调用navigateTo(targetPage)即可实现跳转逻辑。1.2 鸿蒙中的函数特点鸿蒙基于TypeScript/JavaScript和Java两种开发范式函数特性也有所不同ArkTS(基于TS)中的函数特点支持箭头函数和传统函数定义强类型支持需显式声明参数和返回值类型支持async/await异步处理支持函数作为一等公民可赋值给变量Java开发范式中的函数特点严格的面向对象方法定义必须属于某个类支持重载(overload)但不支持默认参数访问控制更严格(public/private等)2. 函数的定义方式2.1 ArkTS中的函数定义基础函数定义function greet(name: string): string { return Hello, ${name}!; }箭头函数const greet (name: string): string Hello, ${name}!;异步函数async function fetchData(url: string): PromiseData { const response await http.get(url); return response.data; }2.2 Java开发范式中的函数定义基本方法定义public class Utils { public static String greet(String name) { return Hello, name !; } }带参数校验的方法public void showToast(Context context, String message) { if (context null || TextUtils.isEmpty(message)) { throw new IllegalArgumentException(参数不能为空); } // 显示Toast的实现 }2.3 特殊函数类型回调函数事件处理Button({ type: ButtonType.Capsule }) { Text(点击) }.onClick(() { // 点击回调函数 console.log(按钮被点击); })生命周期函数struct MyComponent { aboutToAppear() { // 组件即将显示时执行 } aboutToDisappear() { // 组件即将消失时执行 } }3. 函数的实际应用3.1 UI交互中的函数应用表单验证函数function validateForm(formData: FormData): boolean { if (!formData.username || formData.username.length 4) { showToast(用户名至少4个字符); return false; } if (!formData.password || formData.password.length 6) { showToast(密码至少6个字符); return false; } return true; }页面跳转封装function navigateTo(page: string, params?: object) { router.push({ url: pages/${page}, params: params || {} }); }3.2 数据处理函数API请求封装async function requestT(config: { url: string, method?: GET | POST, data?: object }): PromiseT { try { const response await http.request({ url: config.url, method: config.method || GET, data: config.data }); return response.data; } catch (error) { console.error(请求失败:, error); throw error; } }本地数据缓存const storageKey app_data; function saveData(data: object): void { try { const jsonStr JSON.stringify(data); localStorage.setStorageSync(storageKey, jsonStr); } catch (error) { console.error(保存数据失败:, error); } } function loadData(): object | null { try { const jsonStr localStorage.getStorageSync(storageKey); return jsonStr ? JSON.parse(jsonStr) : null; } catch (error) { console.error(读取数据失败:, error); return null; } }4. 函数高级技巧与最佳实践4.1 函数参数处理默认参数function createUser( name: string, age: number 18, isAdmin: boolean false ) { // ... }剩余参数function sum(...numbers: number[]): number { return numbers.reduce((total, num) total num, 0); }对象参数解构function createRectangle({ width 100, height width, color black }: RectangleOptions) { // ... }4.2 函数组合与柯里化函数组合function composeT(...fns: Function[]): (x: T) T { return (x: T) fns.reduceRight((v, f) f(v), x); } const processText compose( (s: string) s.toUpperCase(), (s: string) s.trim(), (s: string) s.replace(/\s/g, ) ); const result processText( hello world ); // HELLO WORLD简单柯里化function multiply(a: number): (b: number) number { return (b: number) a * b; } const double multiply(2); console.log(double(5)); // 104.3 性能优化技巧防抖函数function debounceT extends Function(fn: T, delay: number): T { let timer: number | null null; return function(this: any, ...args: any[]) { if (timer) { clearTimeout(timer); } timer setTimeout(() { fn.apply(this, args); timer null; }, delay); } as unknown as T; } // 使用示例 const search debounce((query: string) { console.log(搜索:, query); }, 300);节流函数function throttleT extends Function(fn: T, interval: number): T { let lastTime 0; return function(this: any, ...args: any[]) { const now Date.now(); if (now - lastTime interval) { fn.apply(this, args); lastTime now; } } as unknown as T; } // 使用示例 const handleScroll throttle(() { console.log(处理滚动事件); }, 200);5. 常见问题与调试技巧5.1 函数作用域问题典型问题for (var i 0; i 5; i) { setTimeout(function() { console.log(i); // 总是输出5 }, 100); }解决方案// 使用let替代var for (let i 0; i 5; i) { setTimeout(function() { console.log(i); // 0,1,2,3,4 }, 100); } // 或使用闭包 for (var i 0; i 5; i) { (function(j) { setTimeout(function() { console.log(j); // 0,1,2,3,4 }, 100); })(i); }5.2 this指向问题典型问题class Button { text: string 点击; handleClick() { console.log(this.text); // 运行时this可能不是Button实例 } } const button new Button(); const clickHandler button.handleClick; clickHandler(); // 错误this为undefined解决方案// 使用箭头函数 class Button { text: string 点击; handleClick () { console.log(this.text); // 正确指向Button实例 } } // 或使用bind class Button { text: string 点击; constructor() { this.handleClick this.handleClick.bind(this); } handleClick() { console.log(this.text); } }5.3 异步处理陷阱典型问题async function fetchData() { const data1 await getData1(); const data2 await getData2(); // 不必要的顺序等待 return { data1, data2 }; }优化方案async function fetchData() { // 并行请求 const [data1, data2] await Promise.all([ getData1(), getData2() ]); return { data1, data2 }; }5.4 调试技巧使用console的进阶技巧function complexCalculation(input: number) { console.time(calculation); console.group(计算过程); // 中间步骤 console.log(输入值:, input); const step1 input * 2; console.log(第一步结果:, step1); const step2 Math.sqrt(step1); console.log(第二步结果:, step2); console.groupEnd(); console.timeEnd(calculation); return step2; }使用debugger语句function troubleshoot(data: any) { // 设置断点 debugger; // 复杂处理逻辑 const result processData(data); return result; }6. 鸿蒙特有函数实践6.1 自定义组件方法定义组件方法Component struct MyComponent { private count: number 0; // 公共方法 public increment(): void { this.count; } // 私有方法 private reset(): void { this.count 0; } build() { Column() { Text(计数: ${this.count}) Button(增加).onClick(() this.increment()) Button(重置).onClick(() this.reset()) } } }6.2 使用系统能力函数调用设备能力async function takePicture(): Promiseimage.PixelMap { try { const camera await camera.getCamera(getContext(this)); const photo await camera.takePhoto(); return photo.pixelMap; } catch (error) { console.error(拍照失败:, error); throw error; } }使用系统服务function vibrate(duration: number 200): void { try { vibrator.startVibration({ type: time, duration: duration }); } catch (error) { console.error(振动失败:, error); } }6.3 鸿蒙API封装实践统一API错误处理async function safeCallT(fn: () PromiseT): Promise[T | null, Error | null] { try { const result await fn(); return [result, null]; } catch (error) { console.error(调用失败:, error); return [null, error]; } } // 使用示例 const [data, error] await safeCall(() someApiCall()); if (error) { // 处理错误 }带重试机制的请求async function withRetryT( fn: () PromiseT, maxRetries: number 3, delay: number 1000 ): PromiseT { let lastError: Error | null null; for (let i 0; i maxRetries; i) { try { return await fn(); } catch (error) { lastError error; if (i maxRetries - 1) { await new Promise(resolve setTimeout(resolve, delay)); } } } throw lastError || new Error(未知错误); }7. 测试与文档7.1 函数单元测试使用Jest测试普通函数// utils.ts export function add(a: number, b: number): number { return a b; } // utils.test.ts import { add } from ./utils; describe(add function, () { it(should add two numbers correctly, () { expect(add(2, 3)).toBe(5); }); it(should handle negative numbers, () { expect(add(-1, 1)).toBe(0); }); });测试异步函数// api.ts export async function fetchUser(id: string): PromiseUser { const response await http.get(/users/${id}); return response.data; } // api.test.ts import { fetchUser } from ./api; describe(fetchUser, () { it(should fetch user data, async () { const mockUser { id: 1, name: 张三 }; http.get.mockResolvedValue({ data: mockUser }); const user await fetchUser(1); expect(user).toEqual(mockUser); expect(http.get).toHaveBeenCalledWith(/users/1); }); });7.2 函数文档注释ArkTS文档注释/** * 计算两个数的和 * param a 第一个加数 * param b 第二个加数 * returns 两个数的和 * example * const result add(2, 3); // 5 */ function add(a: number, b: number): number { return a b; }Java开发范式文档注释/** * 格式化显示时间 * param timestamp 时间戳毫秒 * param pattern 格式模式默认yyyy-MM-dd HH:mm:ss * return 格式化后的时间字符串 * throws IllegalArgumentException 如果时间戳为负数 */ public static String formatTime(long timestamp, String pattern) { // 实现代码 }7.3 性能测试与分析简单性能测试function testPerformance(fn: Function, iterations: number 1000) { const start performance.now(); for (let i 0; i iterations; i) { fn(); } const end performance.now(); const avgTime (end - start) / iterations; console.log(平均执行时间: ${avgTime.toFixed(4)}ms); console.log(总执行时间: ${(end - start).toFixed(2)}ms); console.log(执行次数: ${iterations}); } // 使用示例 testPerformance(() { // 测试的函数调用 heavyCalculation(); }, 10000);内存使用分析function checkMemoryUsage() { const used process.memoryUsage(); console.log(内存使用情况:); for (let key in used) { console.log(${key}: ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB); } } // 在函数调用前后检查内存 checkMemoryUsage(); someMemoryIntensiveFunction(); checkMemoryUsage();8. 项目实战构建工具函数库8.1 项目结构设计/src /utils array.ts # 数组相关工具函数 date.ts # 日期处理函数 device.ts # 设备相关功能 dom.ts # UI操作辅助函数 network.ts # 网络请求封装 storage.ts # 数据存储封装 validate.ts # 验证函数 index.ts # 统一导出入口 /types # 类型定义 /tests # 单元测试8.2 核心工具函数实现日期格式化函数// date.ts /** * 日期格式化 * param date Date对象或时间戳 * param format 格式字符串默认yyyy-MM-dd * example * formatDate(new Date(), yyyy年MM月dd日 HH:mm:ss) */ export function formatDate( date: Date | number, format: string yyyy-MM-dd ): string { const d date instanceof Date ? date : new Date(date); const map: Recordstring, string { yyyy: d.getFullYear().toString(), MM: (d.getMonth() 1).toString().padStart(2, 0), dd: d.getDate().toString().padStart(2, 0), HH: d.getHours().toString().padStart(2, 0), mm: d.getMinutes().toString().padStart(2, 0), ss: d.getSeconds().toString().padStart(2, 0) }; return format.replace(/yyyy|MM|dd|HH|mm|ss/g, match map[match]); }深度对象合并// object.ts /** * 深度合并对象 * param target 目标对象 * param sources 源对象多个 * returns 合并后的新对象 */ export function deepMergeT(target: T, ...sources: PartialT[]): T { if (!sources.length) return target; const result: any Array.isArray(target) ? [...target] : { ...target }; for (const source of sources) { if (!source || typeof source ! object) continue; for (const key in source) { if (source.hasOwnProperty(key)) { const targetValue result[key]; const sourceValue (source as any)[key]; if (isObject(targetValue) isObject(sourceValue)) { result[key] deepMerge({ ...targetValue }, sourceValue); } else { result[key] sourceValue ! undefined ? sourceValue : targetValue; } } } } return result; } function isObject(value: any): boolean { return value typeof value object !Array.isArray(value); }8.3 在鸿蒙项目中使用安装依赖npm install myproject/utils在ArkTS中使用import { formatDate, deepMerge } from myproject/utils; // 使用日期格式化 const now new Date(); console.log(formatDate(now, yyyy年MM月dd日)); // 使用对象合并 const defaultConfig { a: 1, b: { c: 2 } }; const userConfig { b: { d: 3 }, e: 4 }; const merged deepMerge(defaultConfig, userConfig);在Java开发范式中使用// 需要将工具库编译为HarmonyOS Library import com.myproject.utils.DateUtils; import com.myproject.utils.ObjectUtils; // 使用日期格式化 String formatted DateUtils.formatDate(new Date(), yyyy-MM-dd); // 使用对象合并 MapString, Object defaultConfig new HashMap(); MapString, Object userConfig new HashMap(); MapString, Object merged ObjectUtils.deepMerge(defaultConfig, userConfig);9. 函数优化与重构9.1 识别需要优化的函数常见优化信号函数体过长超过50行参数过多超过5个嵌套层级过深超过3层职责不单一做多件不相关的事重复代码片段示例需要优化的函数function processUserData(user: User) { // 验证用户数据 if (!user.name || user.name.length 2) { throw new Error(无效的用户名); } if (!user.email || !user.email.includes()) { throw new Error(无效的邮箱); } // 格式化数据 user.name user.name.trim(); user.email user.email.toLowerCase(); // 保存到数据库 const db getDatabase(); const result db.insert(users, user); // 发送欢迎邮件 const mailService getMailService(); mailService.send({ to: user.email, subject: 欢迎加入, body: 尊敬的${user.name}欢迎注册我们的服务 }); return result; }9.2 函数拆分重构优化后的版本// 验证逻辑提取 function validateUser(user: User): void { if (!user.name || user.name.length 2) { throw new Error(无效的用户名); } if (!user.email || !user.email.includes()) { throw new Error(无效的邮箱); } } // 格式化逻辑提取 function formatUser(user: User): User { return { ...user, name: user.name.trim(), email: user.email.toLowerCase() }; } // 数据库操作提取 async function saveUserToDB(user: User): PromiseResult { const db getDatabase(); return db.insert(users, user); } // 邮件发送提取 async function sendWelcomeEmail(user: User): Promisevoid { const mailService getMailService(); await mailService.send({ to: user.email, subject: 欢迎加入, body: 尊敬的${user.name}欢迎注册我们的服务 }); } // 重构后的主函数 async function processUserData(user: User): PromiseResult { validateUser(user); const formattedUser formatUser(user); const result await saveUserToDB(formattedUser); await sendWelcomeEmail(formattedUser); return result; }9.3 性能关键函数优化缓存优化示例function createCachedFunctionT extends Function(fn: T): T { const cache new Mapstring, any(); return function(this: any, ...args: any[]) { const cacheKey JSON.stringify(args); if (cache.has(cacheKey)) { console.log(从缓存中获取结果); return cache.get(cacheKey); } const result fn.apply(this, args); cache.set(cacheKey, result); return result; } as unknown as T; } // 使用示例 function expensiveCalculation(x: number, y: number): number { console.log(执行复杂计算...); return x * y Math.sqrt(x) Math.pow(y, 2); } const cachedCalculation createCachedFunction(expensiveCalculation); console.log(cachedCalculation(2, 3)); // 执行计算 console.log(cachedCalculation(2, 3)); // 从缓存获取算法优化示例// 优化前O(n^2)复杂度 function findDuplicates(arr: number[]): number[] { const duplicates: number[] []; for (let i 0; i arr.length; i) { for (let j i 1; j arr.length; j) { if (arr[i] arr[j] !duplicates.includes(arr[i])) { duplicates.push(arr[i]); } } } return duplicates; } // 优化后O(n)复杂度 function findDuplicatesOptimized(arr: number[]): number[] { const seen new Setnumber(); const duplicates new Setnumber(); for (const num of arr) { if (seen.has(num)) { duplicates.add(num); } else { seen.add(num); } } return Array.from(duplicates); }10. 鸿蒙函数开发进阶10.1 使用装饰器增强函数日志装饰器function log(target: any, key: string, descriptor: PropertyDescriptor) { const originalMethod descriptor.value; descriptor.value function(...args: any[]) { console.log(调用方法: ${key}, 参数:, args); const result originalMethod.apply(this, args); console.log(方法 ${key} 返回结果:, result); return result; }; return descriptor; } class Calculator { log add(a: number, b: number): number { return a b; } } const calc new Calculator(); calc.add(2, 3); // 会自动打印调用日志性能监控装饰器function measurePerformance( target: any, key: string, descriptor: PropertyDescriptor ) { const originalMethod descriptor.value; descriptor.value async function(...args: any[]) { const start performance.now(); const result await originalMethod.apply(this, args); const end performance.now(); console.log(方法 ${key} 执行耗时: ${(end - start).toFixed(2)}ms); return result; }; return descriptor; } class DataService { measurePerformance async fetchData() { // 模拟网络请求 await new Promise(resolve setTimeout(resolve, 500)); return { data: 示例数据 }; } }10.2 函数式编程实践使用高阶函数处理列表// 定义类型 type PredicateT (item: T) boolean; type MapperT, U (item: T) U; type ReducerT, U (accum: U, item: T) U; // 列表操作函数 function filterT(array: T[], predicate: PredicateT): T[] { return array.filter(predicate); } function mapT, U(array: T[], mapper: MapperT, U): U[] { return array.map(mapper); } function reduceT, U(array: T[], reducer: ReducerT, U, initial: U): U { return array.reduce(reducer, initial); } // 使用示例 const numbers [1, 2, 3, 4, 5]; const evenNumbers filter(numbers, n n % 2 0); const squaredNumbers map(numbers, n n * n); const sum reduce(numbers, (total, n) total n, 0);函数管道function pipeT(...fns: Function[]): (value: T) any { return (value: T) fns.reduce((v, fn) fn(v), value); } // 使用示例 const processText pipe( (s: string) s.trim(), (s: string) s.toUpperCase(), (s: string) s.replace(/[^A-Z]/g, ) ); const result processText( Hello, 123 World! ); // HELLOWORLD10.3 鸿蒙API的响应式封装将回调API转为Promisefunction promisifyT(fn: (callback: (error: any, result?: T) void) void): PromiseT { return new Promise((resolve, reject) { fn((error, result) { if (error) { reject(error); } else { resolve(result!); } }); }); } // 使用示例 async function getLocation(): PromiseLocation { return promisify(geolocation.getCurrentLocation); } // 在组件中使用 async function updateLocation() { try { const location await getLocation(); console.log(当前位置:, location); } catch (error) { console.error(获取位置失败:, error); } }创建响应式数据流class ObservableT { private subscribers: ((value: T) void)[] []; constructor(private value: T) {} get(): T { return this.value; } set(newValue: T): void { this.value newValue; this.notify(); } subscribe(callback: (value: T) void): () void { this.subscribers.push(callback); callback(this.value); return () { this.subscribers this.subscribers.filter(sub sub ! callback); }; } private notify(): void { for (const sub of this.subscribers) { sub(this.value); } } } // 在鸿蒙组件中使用 Component struct CounterComponent { private count new Observable(0); build() { Column() { Text(计数: ${this.count.get()}) .onAppear(() { this.count.subscribe(value { // 当count变化时自动更新文本 this.$update(); }); }) Button(增加) .onClick(() this.count.set(this.count.get() 1)) } } }