让我们从一个实际的问题开始:计算1到n的和,其中n可以是不同的值。
假设我们需要多次计算数列的和。在不同的数学问题中,我们可能需要计算:
每次我们都写出完整的计算代码:
问题分析:
现在让我们用函数来解决这个问题。先不要关注函数内部的细节,我们后面会详细讲解。现在只需要感受函数带来的好处:
函数的价值:
函数就是一段有名字的代码块,它可以接收输入数据,进行处理,然后返回结果。
生活类比:洗衣机
就像洗衣机可以根据不同的衣服和模式产生不同的结果,函数也可以根据不同的输入产生不同的输出。
基于洗衣机的类比,让我们理解函数需要哪四个核心部分:
函数名称(Function Name)
输入参数(Input Parameters)
函数体(Function Body)
返回结果(Return Value)
现在让我们看看具体的 sum 函数是如何对应这四个部分的:
我们现在以上面的 sum 函数为例,进行详细的语法讲解:
函数的完整语法结构:
function 关键字
函数名称:sum
输入参数列表:(n: number)
() 包围参数名: 类型n: number 表示参数名为 n,类型为数字n: number 的语法结构和使用 let n: number 很相似,只是没有 let 关键字返回类型:: number
: 指定: number 表示函数承诺返回一个数字函数体:{...}
{} 包围的代码块return 关键字
return total; 表示将 total 的值作为函数的返回结果return 后面的值类型必须与声明的返回类型一致完整语法模板:
定义完函数后,我们需要调用函数来使用它。让我们学习函数调用的语法:
在之前的课程中,我们已经多次接触过"调用"的概念:
在数组课程中,我们学过调用方法:
我们一直在使用 console.log():
现在学习调用我们自己定义的函数:
调用方法的特点:
变量名.方法名(参数)(注意中间的点号 .)array.push() 中的 array 是数组类型的变量,console.log() 中的 console 是系统控制台类型的变量调用函数的特点:
函数名(参数)(没有点号,直接使用函数名)虽然语法不同,但本质上是相同的:
💡 提示: 关于数据类型和对象的概念,我们很快就会在后续课程中详细学习。现在你只需要理解:
array 和 console 都是某种数据类型的变量push、log)变量名.方法名() 的形式来使用这些方法让我们通过一个完整的例子来分析函数调用的每个步骤:
函数调用 sum(5) 的详细分解:
函数名:sum
圆括号 ()
参数 5
5 会被赋值给函数定义中的参数 n5 是 number 类型,与 n: number 的类型要求一致赋值操作 let result = sum(5)
1515 被保存到变量 result 中result 为 number 类型让我们用一个完整的 sum 函数例子来说明 TypeScript 的类型检查和类型推断:
TypeScript 的自动类型推断:
当我们调用 sum(10) 时,TypeScript 会:
10 是 number 类型,匹配 n: number 的要求: number,自动将 result1 推断为 number 类型基于上面的分析,我们可以总结出函数调用的通用语法结构:
直接调用(不保存返回值):
保存返回值到变量:
语法要点:
函数可以接收多个参数,这让函数能够处理更复杂的数据和逻辑。
让我们看一个完整的例子,包含函数定义和调用,你可以直接运行这些代码:
参数定义规则:
, 分隔参数名: 类型调用要点:
让我们通过一个完整的例子来演示函数调用的各种常见用途:
通过上面的例子,我们可以理解函数调用的一个核心概念:函数调用的结果就是一个值,这个值可以用在任何需要它的地方。
让我们重点分析 add(add(1, 2), add(3, 4)) 这个嵌套调用:
执行顺序:
add(1, 2),得到结果 3add(3, 4),得到结果 7add(3, 7),得到最终结果 10关键理解: 函数调用的结果就是一个普通的数值,可以:
let result = add(1, 2);if (add(1, 2) >= 3)add(add(1, 2), add(3, 4))这就是为什么函数调用可以像数学公式一样灵活使用——因为函数的返回值就是一个普通的值!
现在让我们通过不同的例子来了解函数的更多功能:
有些函数不需要任何输入,它们执行固定的任务:
无参数函数的特点:
() 是空的有些函数只执行操作,不返回结果。这时候我们需要使用 void 类型。
void 类型?void 是 TypeScript 中的一个特殊类型,表示"没有任何值"或"没有返回值"。
void 的英文含义:void 在英语中的意思是"空的"、"空洞的"、"无效的"。在编程中,这个含义很形象:
就像 number 表示数字类型,string 表示字符串类型一样,void 也是一种类型,但它特殊的地方在于:
number 类型:函数会返回一个数字(如 5, 3.14)string 类型:函数会返回一个字符串(如 "hello", "你好")void 类型:函数不会返回任何值,返回值是"空的"(void)void 函数的示例让我们看几个 void 函数的例子:
void 类型的特点和使用规则: void 表示不返回值
: void函数内部的 return 语句
return;(空 return)来提前结束函数return,函数执行完毕后自动结束return 任何具体值:return 5; 或 return "hello"; 都是错误的调用 void 函数
let result = showPlayerInfo(...) 是没有意义的为什么需要 void 类型?
TypeScript 可以自动推断函数的返回值类型,就像变量一样:
自动推断的规则:
return 语句,TypeScript 会推断返回类型return 语句,会推断为 void⚠️ 我们的建议:明确写出返回类型
虽然 TypeScript 可以自动推断返回值类型,但我们建议你总是明确写出返回类型:
为什么建议明确写出返回类型?
在 TypeScript 中,函数的定义和调用没有严格的顺序要求。你可以:
这两种方式都是正确的,TypeScript 都能正常工作!
方式一:先定义,后调用(推荐)
方式二:先调用,后定义(也正确)
虽然 TypeScript 在顺序上很灵活,但我们强烈建议采用"先定义,后调用"的写法,原因如下:
函数和 if 语句、for 循环一样,通过 {} 创建了自己的作用域:
作用域规则:
通过这节课的学习,你已经掌握了函数的核心概念和各种功能:
: void 类型,只执行操作不返回结果继续练习使用函数,你会发现编程变得更加高效和有趣!