TypeScript:箭头函数

在TypeScript中,箭头函数是一种简洁的函数定义方式。以下是一些使用箭头函数的例子:

  1. 基本的箭头函数

    const add = (x: number, y: number) => {
      return x + y;
    };
    
  2. 单个参数的箭头函数可以省略括号

    const square = (x: number) => x * x;
    
  3. 如果没有函数体或者只有一条返回语句,可以省略花括号和return关键字

    const add = (x: number, y: number) => x + y;
    
  4. 如果函数体有多行代码,需要使用花括号,并且不能省略return关键字

    const calculate = (x: number, y: number) => {
      let result = x + y;
      result *= 2;
      return result;
    };
    
  5. 访问外部作用域的变量

    let num = 10;
    const multiply = () => num * 2;
    
  6. 使用类型推断
    TypeScript可以自动推断箭头函数的参数类型和返回类型,但如果需要明确指定类型,也可以添加类型注解。

    const addTyped = (x: number, y: number): number => {
      return x + y;
    };
    

箭头函数的一个重要特性是它们没有自己的this值,而是捕获其所在(即定义时)的作用域的this值。这在处理事件回调、定时器或者其他需要保持this上下文的场景中非常有用。

示例

以下是一些使用箭头函数在TypeScript中保持this上下文的示例:

  1. 事件回调
    在TypeScript中,当使用普通函数作为事件处理器时,this通常会被设置为触发事件的元素。但是,如果你在类的方法中定义了一个事件处理器并将其作为回调传递,那么这个方法中的this可能会被改变。使用箭头函数可以避免这个问题。

    class MyClass {
      private counter = 0;
    
      constructor() {
        document.getElementById('myButton').addEventListener('click', () => {
          this.counter++;
          console.log('Counter:', this.counter);
        });
      }
    }
    

    在这个例子中,箭头函数捕获了MyClass实例的this值,因此即使在事件处理器内部,this.counter也能正确地引用类的成员变量。

  2. 定时器
    类似于事件回调,当使用setTimeoutsetInterval时,如果使用普通函数,this的值可能会被改变。使用箭头函数可以确保this的值保持不变。

    class MyClass {
      private timerId: number;
    
      startTimer() {
        this.timerId = setInterval(() => {
          console.log('Timer:', this.timerId);
        }, 1000);
      }
    
      stopTimer() {
        clearInterval(this.timerId);
      }
    }
    

    在这个例子中,箭头函数捕获了MyClass实例的this值,因此即使在定时器回调内部,this.timerId也能正确地引用类的成员变量。

  3. Promise回调
    在处理Promise的thencatch方法时,如果不使用箭头函数,this的值可能会被改变。使用箭头函数可以确保this的值保持不变。

    class MyClass {
      private data: any;
    
      fetchData(): Promise<void> {
        return fetch('https://api.example.com/data')
          .then((response: Response) => response.json())
          .then((data: any) => {
            this.data = data;
            console.log('Fetched data:', this.data);
          })
          .catch((error: Error) => {
            console.error('Error fetching data:', error);
          });
      }
    }
    

    在这个例子中,箭头函数捕获了MyClass实例的this值,因此即使在Promise回调内部,this.data也能正确地引用类的成员变量。注意,这里我们还添加了类型注解来明确返回值和参数类型。

this旁白:

解读:
this就像是王国中的上帝视角,每当发出this这个命令时,就像是将自身提到空中的制高点俯瞰整个王国,然后通过.city,进入了王国的一座都市,再通过.area,进入都市的一个区域。通过这种方式能够自由的在整个王国中穿梭,你就仿佛是一个超能力者一般。

在这里插入图片描述

然后:
虽然this能够让你起飞,但也会在一些区域受阻,他并不能在任何建筑内飞行。比如当你在王国上空忽然定位到了一座建筑内,这里的建筑是一个类或对象的内部函数。此时,再用this就没有办法飞出建筑,而是会撞到建筑的天花板上,此时,用this只能在这个建筑内任意飞行了,飞行范围受到了严重的限制。此时的办法,就是先让函数运行完,从门窗飞出,(门是底部return,窗是中途的条件return)。
在这里插入图片描述
因此:
this想要确定飞行范围,关键是要先定位,看看你是在哪一个封闭空间内,封闭空间本身越大,飞行的范围就越广。想要到达心中的目标,首先要定位,这是this的使用前提。
在这里插入图片描述
  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值