购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第3章
函数

本章将深入探索ArkTS编程语言中函数的多彩世界。笔者将从基础知识入手,逐步讲解高级特性,确保读者全面掌握函数的各个方面。

首先,将介绍函数的声明,包括函数的命名、参数和基本结构。随后,将讨论可选参数和Rest参数的使用,这两种参数可以帮助开发者编写更灵活、更具扩展性的函数。接下来讲解返回类型的概念,这对于确保函数输出的可预测性至关重要。此后,还将深入解析函数的作用域,这是理解变量访问规则和生命周期的基础。

在掌握函数基础知识后,将带领读者进入更高级的主题。我们将探讨不同类型的函数调用方式,以及如何识别和使用函数的类型。此外,还将介绍Lambda函数,它是一种简洁的函数表达式,非常适合用于回调或匿名函数的场景。

本章还将讲解闭包,这是一种强大的编程技术。闭包允许函数访问创建时的上下文环境,即使该环境的外部函数已执行完毕,依然可以操作其中的变量。

最后,将探讨函数的重载特性,这种技术使得同一个函数名能够根据参数的不同而执行不同操作,从而提升代码的可读性和灵活性。

通过本章的学习,读者将能够更加游刃有余地应用函数相关知识,在编程中编写出更高效、优雅的代码。

3.1 函数声明

ArkTS中的函数声明是指在ArkTS编程语言中定义函数的过程。声明函数的目的是告知编译器或解释器该函数的名称、接收的参数(如果有)以及返回的类型(如果有)。函数声明是程序的基本构件之一,用于创建可重用的代码块。

函数声明的语法如下:

function functionName(parameter1: type1, parameter2: type2): returnType {
   // 函数体
   return value;
}

在函数声明中,必须为每个参数声明(或指定)类型。如果参数是可选参数,可以在调用函数时省略该参数。此外,函数的最后一个参数可以是rest参数,用于接收不确定数量的参数。

以下示例代码(见文件3-1)展示了一个简单的函数声明:该函数名为add,接收两个string类型的参数,返回值类型为string。

文件3-1 函数声明用法的示例代码

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

console.log(add('hello', 'world'));

上述代码定义了一个名为add的函数,该函数将两个字符串连接并返回结果。在该示例中,add('hello', 'world')的调用会输出字符串“hello world”。

3.2 可选参数

在ArkTS编程语言中,函数支持定义可选参数。这意味着函数的参数列表中可以包含一个或多个可选参数。如果函数声明了参数列表,但未将某些参数标记为可选参数,则在调用函数时,必须为所有声明的参数提供值。这种情况在参数数量较多时,可能导致函数调用变得复杂。通过引入可选参数,可以显著简化函数的调用方式。

可选参数具有以下特性:

● 灵活性:可选参数允许在调用函数时,用户仅需传递他们关心的参数,而省略其他参数。这使得函数调用更加灵活和简洁。

● 默认值:对于未传递的可选参数,函数可以指定默认值,从而避免了未定义的情况。

可选参数的语法格式可为name?: Type,示例代码如文件3-2所示。

文件3-2 可选参数用法的示例代码

function hello(name?: string) {
  if (name == undefined) {
    console.log('Hello!');
  } else {
    console.log(`Hello, ${name}!`);
  }
}

// 正确的函数调用,不传递参数
hello();
// 正确的函数调用,传递参数
hello('zhangsan');

此外,可选参数还可以设置默认值。当函数被调用时,如果省略了该参数,则会使用默认值作为实际参数,示例代码如文件3-3所示。

文件3-3 设置默认值的可选参数的示例代码

3.3 rest参数

ArkTS在编程中,rest参数(也称为剩余参数)是一种函数参数的语法,用于将不确定数量的参数表示为一个数组。这种功能在JavaScript和TypeScript等语言中十分常见,使得编写接收可变数量参数的函数更加简单和灵活。

函数的最后一个参数可以定义为rest参数。使用rest参数时,函数或方法可以接收任意数量的实参。以下示例程序(见文件3-4)展示了rest参数的使用方法。

文件3-4 rest参数用法的示例代码

3.4 返回类型

返回类型是ArkTS编程语言中用于指定函数或方法返回值的数据类型,它是函数定义的重要组成部分,明确了函数调用者可以预期的返回值类型。

如果函数体内的代码可以推断出函数返回值的类型,则在函数声明中可省略标注的返回类型。返回类型用法的示例代码如文件3-5所示。

文件3-5 返回类型用法的示例代码

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

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

console.log(foo());
console.log(goo());

对于不需要返回值的函数,可以显式指定为void或省略标注。这类函数通常不需要返回语句return。以下示例代码(见文件3-6)展示了两种有效的void返回类型的函数声明方式。

文件3-6 有效的void返回类型用法的示例代码

function hi1() {
  console.log('hi');
}

function hi2(): void {
  console.log('hi');
}

hi1();
hi2();

3.5 函数的作用域

函数的作用域是指变量和函数在代码中的可见性和可访问范围。作用域定义了变量和函数的生命周期以及访问权限的界限。

函数作用域的关键点如下:

(1)局部作用域:在函数内部定义的变量只能在该函数内部访问,无法从外部访问。这些变量是局部的,它们的生命周期仅限于函数调用期间。

(2)变量覆盖:如果函数内部定义的变量与外部作用域中已有的变量同名,则函数内部的局部变量会覆盖外部定义的变量。这种行为遵循“就近原则”,即优先使用当前作用域中的变量。

演示函数作用域的示例代码如文件3-7所示。

文件3-7 演示函数作用域的示例代码

let x = 10; // 外部变量
function example() {
    let x = 20;        // 局部变量,覆盖外部变量
    console.log(x); // 输出 20
}

example();
console.log(x); // 输出 10

在上述示例代码中,函数example内部定义的局部变量x覆盖了外部的变量x,因此在函数内部输出的是局部变量的值(20),而在函数外部仍然可以访问到外部变量x(值为10)。

3.6 函数的调用

函数调用是执行已定义函数的过程,运行函数内部的一段代码并返回结果。通过编写函数和进行函数调用,可以避免重复编写相同的代码,使代码更具模块化和可重用性,从而提高程序的组织性和可读性。

演示函数调用的示例代码如文件3-8所示。

文件3-8 演示函数调用的示例代码

// 声明函数
function join(x: string, y: string): string {
  let z: string = `${x} ${y}`;
  return z;
}
// 调用函数,需要传递两个string类型的参数
let x = join('hello', 'world');
console.log(x);

3.7 函数类型

函数类型是指在定义函数时指定的参数类型和返回类型。函数类型通常用于定义回调函数(作为参数传递给其他函数)或用于描述某种特定的函数签名。这种类型定义有助于提高代码的可读性和类型安全性。

函数类型及其用法的示例代码如文件3-9所示。

文件3-9 函数类型及其用法的示例代码

// 使用type关键字定义函数类型
// 表示该函数类型接收一个number类型的参数,并返回一个number类型的结果
type trigFunc = (x: number) => number;

// 定义一个函数,接收参数为上述定义的函数类型
function do_action(f: trigFunc): number {
  // 调用函数获取结果
  return f(3.141592653589);
}
// Math.sin符合trigFunc类型的要求
// 使用Math.sin作为参数调用do_action函数
let result = do_action(Math.sin);

console.log(`最终的结果为:${result}`);

3.8 箭头函数或Lambda函数

箭头函数(也称为Lambda函数)是一种简洁的表达方式,具有以下特点:

(1)语法简洁:箭头函数使用箭头符号(=>)来定义,在语法上比传统的函数表达式更简洁。

(2)不绑定this:箭头函数不绑定自己的this值,而是捕获其所在上下文的this值,避免了因绑定this而导致的常见问题。

(3)省略花括号:当箭头函数的函数体只有一条语句时,可以省略花括号,且该表达式会作为函数的返回值。

(4)适用于回调函数:箭头函数常用于定义回调函数,因为它的语法简洁且自动绑定this,避免了上下文切换的复杂性。

箭头函数定义的示例代码如文件3-10所示。

文件3-10 箭头函数定义的示例代码

let sum = (x: number, y: number): number => {
  return x + y;
}

箭头函数的返回类型可以省略。在省略时,返回类型会根据函数体的内容自动推断。

当箭头函数的函数体是单一表达式时,还可以进一步简化为单行形式。以下两种写法是等价的(见文件3-11)。

文件3-11 箭头函数两种编写方式的示例代码

let sum1 = (x: number, y: number) => {
  return x + y;
}

let sum2 = (x: number, y: number) => x + y;

3.9 闭包

闭包是由函数及其声明时的环境共同组成的结构。闭包可以访问其创建时作用域内的任何局部变量,即使在闭包执行时这些变量已经超出它们的原始作用域。

闭包用法的示例代码如文件3-12所示。

文件3-12 闭包用法的示例代码

在本例中,z是执行f时创建的g箭头函数实例的引用。g的实例维持了对它的环境(即f函数中的作用域,变量count包含其中)的引用。因此,当z被调用时,变量count依然可用,并且能够保留调用后的状态。

3.10 函数重载

函数重载允许为同一个函数提供多种调用方式。通过编写多个同名但参数类型或参数数量不同的函数声明,可以实现函数的重载。函数重载用法的示例代码如文件3-13所示。

文件3-13 函数重载用法的示例代码

需要注意以下两点:

(1)函数声明必须唯一:不允许重载的函数具有相同的参数列表,否则编译时会报错。

(2)函数实现紧随声明:所有函数声明应紧跟一个通用实现,用于处理所有重载情况。

3.11 本章小结

本章介绍了ArkTS编程语言中有关函数的基本概念和高级特性,涵盖了函数声明、可选参数、rest参数、返回类型、作用域、函数调用、函数类型、箭头函数、闭包和函数重载。

通过本章的学习,读者能够全面理解函数的相关概念,为HarmonyOS的开发之旅奠定基础。

3.12 本章习题

(1)编写一个名为concatStrings的函数,该函数接收两个字符串参数,并返回它们的拼接结果。然后编写测试代码调用该函数,并输出结果。

(2)编写一个名为greet的函数,该函数接收一个可选的字符串参数name。如果提供了name,则输出“Hello, name!”;如果没有提供name,则输出“Hello, Guest!”。使用参数默认值实现该功能。

(3)编写一个名为average的函数,该函数接收任意数量的数值参数,并返回这些数值的平均值。

(4)编写一个名为createCounter的函数,该函数返回一个箭头函数。返回的箭头函数每调用一次,计数器加1,并返回当前计数值。利用闭包特性实现计数器功能。

(5)编写一个名为print的函数,该函数可以接收一个字符串或一个数值作为参数,并在控制台输出对应的内容。请为该函数实现重载。 lU6Qjyfde0D7hVkvCygpTMumn1giBZDML4Ea2n8ot4yEQIcndcgTNYVo7kRaaxsL

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开