Skip to content

TypeScript 中的 this 参数说明

关键区别

TypeScript 代码(编译前)

typescript
replaceAop(originalXhrProto, 'open', (originalOpen: voidFun) => {
    return function (this: any, ...args: any[]): void {
      // this: any 是类型注解,不是真正的参数
      this.websee_xhr = { ... };
      originalOpen.apply(this, args);
    };
});

编译后的 JavaScript 代码

javascript
replaceAop(originalXhrProto, 'open', (originalOpen) => {
    return function (...args) {
      // 注意:this 参数在编译后被移除了!
      this.websee_xhr = { ... };
      originalOpen.apply(this, args);
    };
});

为什么 TypeScript 允许 this: any

  1. 类型注解,不是参数this: any 是 TypeScript 的特殊语法,用于指定函数的 this 上下文类型
  2. 编译时移除:TypeScript 编译器会移除这个类型注解,不会出现在最终的 JavaScript 代码中
  3. 类型检查:帮助 TypeScript 进行类型检查,确保 this 的使用是正确的

在 JavaScript 中

  • 不能写function(this, ...args) - this 是保留关键字
  • 正确写法function(...args) - this 由调用方式决定

实际运行时的 this

无论是 TypeScript 还是 JavaScript,当函数作为方法调用时:

javascript
xhr.open("GET", "https://api.github.com");
// 此时 this 自动指向 xhr 实例

this 的值由调用方式决定,不是通过参数传递的。

更新时间: