Bootstrap

第五章:ArkTs 函数

一、ArkTs 函数基础声明与参数类型标注

在 ArkTs 中,函数声明有着严谨的规范。以下是一个简单的函数示例:

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

这里定义了 add 函数,它接受两个 string 类型的参数 x 和 y,并返回一个 string 类型的值。这种严格的类型标注有助于在编码阶段发现类型不匹配的错误,提高代码的稳定性和可读性。例如,当我们调用 add 函数时:

let result = add("Hello", "World");
console.log(result); // 输出 "Hello World"

二、ArkTs 函数可选参数的运用

ArkTs 提供了两种设置可选参数的方式。

// 可选参数格式 name?: Type
function hello(name?: string) {
  if (name == undefined) {
    console.log('hi');
  } else {
    console.log(`hi,${name}`);
  }
}

hello 函数的 name 参数为可选参数。当我们调用该函数时:

// 不传参数调用
hello(); // 输出 "hi"

// 传入参数调用
hello("Alice"); // 输出 "hi,Alice"

另一种可选参数形式是设置默认值:

function multiply(n: number, coeff: number = 2): number {
  return n * coeff;
}

对于 multiply 函数:

// 只传一个参数,使用默认的 coeff 值
console.log(multiply(3)); // 输出 6 (因为使用了默认的 coeff 值 2,计算 3 * 2)

// 传入两个参数
console.log(multiply(4, 3)); // 输出 12 (计算 4 * 3)

三、ArkTs 函数 Rest 参数的强大功能

Rest 参数允许函数接收任意数量的实参。

function sum(...numbers: number[]): number {
  let res = 0;
  for (let n of numbers) {
    res += n;
  }
  return res;
}

在使用 sum 函数时:

// 不传参数调用
console.log(sum()); // 输出 0

// 传入多个参数调用
console.log(sum(1, 2, 3, 4)); // 输出 10

四、ArkTs 函数返回类型的处理

在 ArkTs 中,函数返回类型有多种处理方式。

// 显式指定返回类型
function foo(): string { return 'aaaa' };

// 推断返回类型为 string
function goo() { return 'goo' };

对于不需要返回值的函数:

// 省略返回类型标注
function hi1() { console.log('aaa') }

// 显式指定返回类型为 void
function hi2(): void { console.log('bbb') }

五、ArkTs 函数作用域与变量访问规则

ArkTs 函数遵循严格的作用域规则。

let globalVar = "I'm global";

function localVarTest() {
  let localVar = "I'm local";
  console.log(localVar); // 输出 "I'm local"
  // 无法在函数外部访问 localVar
  // console.log(globalVar); // 会报错,如果在函数内部定义了同名变量
}

localVarTest();
console.log(globalVar); // 输出 "I'm global"

函数内部定义的变量仅在函数内部可访问,若与外部同名则覆盖外部定义。

六、ArkTs 函数调用与参数传递机制

函数调用时,实参按顺序赋值给形参。

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

// 调用函数,传入两个 string 类型的参数
let result = join('Hello', 'World');
console.log(result); // 输出 "Hello World"

七、ArkTs 函数类型与回调函数应用

ArkTs 可以定义函数类型用于回调。

type StringFunc = (x: number) => number; // 这是一个函数类型

function do_action(f: StringFunc) {
  f(5); // 调用回调函数
}

// 将 Math.sqrt 函数作为参数传入
do_action(Math.sqrt); 

八、ArkTs 箭头函数的便捷性

ArkTs 支持箭头函数,具有简洁的语法。

// 箭头函数示例
let sumArrow = (x: number, y: number): number => {
  return x + y;
}

// 使用箭头函数计算两数之和
console.log(sumArrow(2, 3)); // 输出 5

// 省略返回类型的箭头函数示例
let sum1 = (x: number, y: string) => { return x + y };
let sum2 = (x: number, y: string) => x + y;

// 调用 sum1 和 sum2 函数
console.log(sum1(3, " is a number")); // 输出 "3 is a number"
console.log(sum2(4, " is also a number")); // 输出 "4 is also a number"

九、ArkTs 闭包的独特魅力

闭包在 ArkTs 中有着重要的地位。

function f(): () => number {
  let count = 0;
  let g = (): number => { count++; return count; }
  return g;
}

let z = f();
// 第一次调用 z
console.log(z()); // 返回:1
// 第二次调用 z
console.log(z()); // 返回:2

闭包由函数及其声明环境组成,能够捕获并保留局部变量,使得函数在多次调用间可以维持状态。

十、ArkTs 函数重载的实现与规则

ArkTs 支持函数重载,以满足不同的调用需求。

function foo(x: number): void; // 第一个函数定义
function foo(x: string): void; // 第二个函数定义
function foo(x: number | string): void {
  if (typeof x === 'number') {
    console.log(`Received a number: ${x}`);
  } else if (typeof x === 'string') {
    console.log(`Received a string: ${x}`);
  }
};

// 调用重载的 foo 函数
foo(123); // 使用第一个函数定义,输出 "Received a number: 123"
foo("Hello, Overloading"); // 使用第二个函数定义,输出 "Received a string: Hello, Overloading"

// 不允许重载函数由相同的名字以及参数列表,否则将会编译报错

通过对 ArkTs 函数这些特性的深入理解和熟练运用,我们能够编写出更加高效、灵活且易于维护的代码,充分发挥 ArkTs 在应用开发中的优势。

请注意,以上代码示例基于 ArkTs 的相关概念和语法风格进行编写和解释,但 ArkTs 可能还有其他特定的语言细节和特性未完全涵盖在这个示例中。在实际使用 ArkTs 进行开发时,需要进一步深入学习其官方文档和相关最佳实践。

;