1.函数
函数中定义的变量和其他实例仅可以在函数内部访问,不能从外部访问.
如果函数中定义的变量与外部作用域中已有实例同名,则函数内的局部变量定义将覆盖外部定义。
1.1 普通函数:将两个字符串拼接并返回
typescript
function add(x: string, y: string): string {
let z: string = `${x} ${y}`;
return z;
}
1.2带可选参数的函数
参数 name 为可选参数,如果未传入该参数,输出 'Hello!' 如果传入了该参数,输出包含该参数的问候语
javascript
function hello(name?: string) {
if (name === undefined) {
console.log('Hello!');
} else {
console.log(`Hello, ${name}!`);
}
}
1.3可选参数加默认值的函数
参数 coeff 有默认值 2,如果调用时不传入该参数,将使用默认值进行计算
typescript
function multiply(n: number, coeff: number = 2): number {
return n * coeff;
}
1.4 动态参数函数
使用 ...numbers 接收任意数量的数字参数,并返回它们的总和
ini
function sum(...numbers: number[]): number {
let res = 0;
for (let n of numbers) {
res += n;
}
return res;
}
1.5 闭包函数
闭包函数: 声明在一个函数中的函数,叫做闭包函数。
闭包: 内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
scss
function outerFn(){
var i = 0;
function innerFn(){
i++;
console.log(i);
}
return innerFn;
}
var inner = outerFn(); //每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址
inner();
inner();
inner();
var inner2 = outerFn();
inner2();
inner2();
inner2(); //1 2 3 1 2 3
1.6 函数重载
我们可以通过编写重载,指定函数的不同调用方式。具体方法为,为同一个函数写入多个同名但签名不同的函数头,函数实现紧随其后。
typescript
function foo(x: number): void; /* 第一个函数定义 */
function foo(x: string): void; /* 第二个函数定义 */
function foo(x: number | string): void { /* 函数实现 */
}
foo(123); // OK,使用第一个定义
foo('aa'); // OK,使用第二个定义
1.7 箭头函数(又名Lambda函数)
typescript
let sum = (x: number, y: number): number => {
return x + y;
}
1.8 函数做参数
scss
type trigFunc = (x: number) => number // 这是一个函数类型
function do_action(f: trigFunc) {
f(3.141592653589); // 调用函数
}
do_action(Math.sin); // 将函数作为参数传入
总结
- 函数结构
lua
function 函数名 (参数名: 参数类型) : 返回类型 {
参数实现
}
- ?表示可选参数
c
function hello(name?: string) {
console.log('Hello!');
}
- 箭头函数
typescript
let sum = (x: number, y: number): number => { return x + y; }
- 闭包 函数嵌套函数 内部函数能获取外部函数的变量 且改变变量后 变量变动保持=
matlab
function outerFn(){ var i = 0; function innerFn(){ i++; console.log(i); } return innerFn; } var inner = outerFn(); //每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址 inner(); inner(); inner(); var inner2 = outerFn(); inner2(); inner2(); inner2(); //1 2 3 1 2 3