V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX  ›  TypeScript

不是很懂为什么这个 WebSocket 事件赋值的时候,可以忽略第一个参数?

  •  
  •   yazoox · 2021-04-19 17:48:33 +08:00 · 1210 次点击
    这是一个创建于 1314 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到这样一段代码(节选)

    这里是定义部分

    export interface BaseWebSocket {
      onopen: ((this: WebSocket, ev: Event) => any) | null;
    }
    
    class MyWebSocket implements BaseWebSocket {
      webSocket?: WebSocket;
      onopen: ((this: WebSocket, ev: Event) => any) | null = null;
    
      connect(url: string): void {
        this.webSocket = new WebSocket(url);
        this.webSocket.onopen = this.onopen;
      }
    }
    
    
    

    然后,再下面某个函数里面,再创建该 class 的实例,并调用给这个实例的 onopen 添加实现的时候,只有一个“参数”。

    (blabla...)
        const webSocket = webSocketIn ? webSocketIn : new MyWebSocket();
    
        webSocket.onopen = _event => {
          // 具体的实现代码,这里,这个 arrow function 只有一个参数
          // 但是,onopen 的接口定义,是两个参数
          // 第一个参数,this: WebSocket 为什么可以忽略?还是...... 
        }
        
        (blabla...)
        webSocket.connect("url here...")
    
    

    google 了一下,没有找到答案,估计是我搜索关键字不对......

    3 条回复    2021-04-20 16:28:06 +08:00
    EPr2hh6LADQWqRVH
        1
    EPr2hh6LADQWqRVH  
       2021-04-19 17:51:19 +08:00
    因为 this 不是参数,它只管标注,编译成 js 的时候没这个参数。
    anguiao
        2
    anguiao  
       2021-04-19 18:18:44 +08:00 via Android   ❤️ 1
    这里的“this”不是真正的参数,参数只有“ev”一个。
    之所以这么写,是为了保证方法的调用者是 WebSocket 类型的,避免 this 指向问题。
    TS 的 handbook 里有写,https://www.typescriptlang.org/docs/handbook/2/classes.html#this-parameters
    yazoox
        3
    yazoox  
    OP
       2021-04-20 16:28:06 +08:00
    @anguiao
    好吧,用 typescript this parameter 就能够搜索到。可惜我一直用 javascript this parameter,到处 都是解释 this 的.....
    thx.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2765 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:50 · PVG 22:50 · LAX 06:50 · JFK 09:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.