函数声明和表达式

在 TypeScript 中,函数是构建程序的基本模块之一。函数可以被声明为独立的代码块,也可以作为表达式嵌入到其他代码中。理解函数声明和表达式的区别以及如何使用它们是掌握 TypeScript 编程的关键。

1. 函数声明

函数声明是一种定义函数的方式,它使用 function 关键字来声明一个函数。函数声明会在代码执行之前被提升(hoisted),这意味着你可以在声明函数之前调用它。

1.1 基本语法

function 函数名(参数1: 类型, 参数2: 类型): 返回类型 {
    // 函数体
    return 返回值;
}

1.2 示例

function greet(name: string): string {
    return `Hello, ${name}!`;
}

console.log(greet("Alice")); // 输出: Hello, Alice!

在这个例子中,greet 函数接受一个字符串类型的参数 name,并返回一个字符串。

1.3 函数声明的提升

console.log(greet("Bob")); // 输出: Hello, Bob!

function greet(name: string): string {
    return `Hello, ${name}!`;
}

即使函数在调用之后声明,TypeScript 仍然能够正确执行,因为函数声明会被提升到作用域的顶部。

2. 函数表达式

函数表达式是将函数赋值给变量的一种方式。与函数声明不同,函数表达式不会被提升,因此你必须在调用之前定义它。

2.1 基本语法

const 变量名 = function(参数1: 类型, 参数2: 类型): 返回类型 {
    // 函数体
    return 返回值;
};

2.2 示例

const greet = function(name: string): string {
    return `Hello, ${name}!`;
};

console.log(greet("Charlie")); // 输出: Hello, Charlie!

在这个例子中,greet 是一个函数表达式,它被赋值给一个变量,并且可以在之后调用。

2.3 函数表达式的提升问题

console.log(greet("Dave")); // 错误: greet 未定义

const greet = function(name: string): string {
    return `Hello, ${name}!`;
};

在这个例子中,尝试在定义 greet 之前调用它会导致错误,因为函数表达式不会被提升。

3. 箭头函数

箭头函数是 ES6 引入的一种简洁的函数表达式语法。它使用 => 符号来定义函数,并且具有更简洁的语法和不同的 this 绑定行为。

3.1 基本语法

const 变量名 = (参数1: 类型, 参数2: 类型): 返回类型 => {
    // 函数体
    return 返回值;
};

3.2 示例

const greet = (name: string): string => {
    return `Hello, ${name}!`;
};

console.log(greet("Eve")); // 输出: Hello, Eve!

3.3 单行箭头函数

如果函数体只有一行代码,可以省略大括号和 return 关键字:

const greet = (name: string): string => `Hello, ${name}!`;

console.log(greet("Frank")); // 输出: Hello, Frank!

4. 实践练习

练习 1: 函数声明

编写一个函数 calculateArea,接受两个参数 width 和 height,并返回矩形的面积。使用函数声明的方式定义这个函数。

function calculateArea(width: number, height: number): number {
    return width * height;
}

console.log(calculateArea(5, 10)); // 输出: 50

练习 2: 函数表达式

使用函数表达式的方式重写 calculateArea 函数。

const calculateArea = function(width: number, height: number): number {
    return width * height;
};

console.log(calculateArea(5, 10)); // 输出: 50

练习 3: 箭头函数

使用箭头函数的方式重写 calculateArea 函数。

const calculateArea = (width: number, height: number): number => width * height;

console.log(calculateArea(5, 10)); // 输出: 50

5. 总结

函数声明和函数表达式是 TypeScript 中定义函数的两种主要方式。函数声明具有提升特性,而函数表达式则没有。箭头函数提供了一种更简洁的语法,并且在处理 this 关键字时具有不同的行为。通过掌握这些概念,你将能够更灵活地编写 TypeScript 代码。

在接下来的课程中,我们将探讨函数的参数处理,包括可选参数、默认参数和剩余参数。