定义
在本节课中,你将看到 TypeScript 中函数的高级定义。
函数与 TypeScript

函数是 JavaScript 的核心。该语言采用函数作用域。TypeScript 在这一点上没有改变,仍然支持使用块级作用域(let 和 const),这也是 **ECMAScript 2015** 的一个特性。
在本章中,你将:
- 回顾如何在 TypeScript 中定义函数,并与 JavaScript 进行对比。
- 了解 TypeScript 如何通过提供明确的参数和返回值类型签名来增强函数功能。
- 探讨
this指针的使用方式,它常常令人困惑,但 TypeScript 能使其更加清晰简洁。
函数与关键字
使用 function 关键字后跟函数名称即可定义一个新函数。“命名函数”是指显式使用 function 来标识一个函数。同样使用该关键字,也可以创建无名的匿名函数。匿名函数可以通过变量进行后续调用。在这两种情况下,函数都可以被多次调用,并返回单一值。
以下示例中,第 1 行定义了一个命名函数。它在第 17 行通过函数名加括号的方式被调用。类似地,命名函数也可以通过变量名 f1 调用。注意:不能直接通过函数名调用。我们在第 5 行进行命名的唯一作用是在调试时提供额外信息,使堆栈追踪能够显示函数名称。
第 9 行定义的函数是匿名的,可以通过变量名 f2 调用,如第 20 行所示。最后一个例子是一个既无名称也无变量引用的匿名函数:它在第 15 行立即执行。
1function fctNamedFunction1() { // 命名函数 2 console.log("命名函数 1"); 3} 4 5let f1 = function fctNamedFunction2() { // 命名函数 6 console.log("命名函数 2"); 7}; 8 9let f2 = function () { // 匿名函数 10 console.log("匿名函数 1"); 11}; 12 13(function () { // 匿名函数 + 立即执行 14 console.log("匿名函数 2"); 15})(); 16 17fctNamedFunction1(); 18// fctNamedFunction2(); // 无法通过名称调用 19f1(); 20f2();
在上述所有示例中,都使用了 function 关键字。然而,函数也可以不使用该关键字定义,例如使用 “箭头函数” =>,或在类中定义。这些内容将在本章中详细介绍。
函数与作用域
TypeScript 在变量作用域的定义上与 JavaScript 保持一致。函数可以访问其内部定义的所有函数,以及所有外部作用域中的函数。
函数可以嵌套,这为封装策略带来了多种可能性。例如,一个主函数可以包含两个子函数。这两个子函数可以访问主函数的变量,但无法访问彼此的内部变量。这是因为两个子函数各自创建了边界,形成了同级作用域,而非父子作用域关系。
1var function1 = () => { // 箭头函数示例 2 let variable1 = 1; 3 var function2 = () => { 4 let variable2 = 2; 5 console.log(variable1 + variable2); // 访问函数1中的变量 6 }; 7 function2(); 8}; 9function1();
在接下来的课程中,你将了解到函数可以分为两类:函数表达式 和 函数声明。