Javascript XMLHttpRequest类型脚本与';这';

Javascript XMLHttpRequest类型脚本与';这';,javascript,typescript,xmlhttprequest,Javascript,Typescript,Xmlhttprequest,我在使用XMLHttpRequest和typescript时遇到了一个问题,下面是一个typescript类: class Myclass { constructor() { this.init(); } private init() { const req = new XMLHttpRequest(); req.onreadystatechange = ( event: Event ): any => { if (this.readyState === XML

我在使用XMLHttpRequest和typescript时遇到了一个问题,下面是一个typescript类:

class Myclass {
 constructor() {
   this.init();
 }

 private init() {
  const req = new XMLHttpRequest();
  req.onreadystatechange = ( event: Event ): any => {
   if (this.readyState === XMLHttpRequest.DONE) {
    if (this.status === 200) {
      this.render(this.responseText)
    }
   }
  };

  req.open('GET', '/api/test', true);
  req.send(null);
 };

private render( data:any ) {
  console.log(`use ${data}`)
 }
}
在本例中,“this”将引用typescript类Myclass 使用javascript函数“this”将引用请求,我将无法调用我的类方法render()


如何调用render()方法并仍然可以访问响应?

您已经可以使用
req
变量访问
XMLHttpRequest

如果您喜欢更干净的方式,可以将请求绑定到回调函数lite,以便:

req.onreadystatechange = (function ( request: XMLHttpRequest, event: Event ): any {
    if (request.readyState === XMLHttpRequest.DONE) {
        if (request.status === 200) {
            this.render(request.responseText)
        }
    }
}).bind(this, req);
或者反过来说:

req.onreadystatechange = (function ( myClassObject: MyClass, event: Event ): any {
    if (this.readyState === XMLHttpRequest.DONE) {
        if (this.status === 200) {
            myClassObject.render(this.responseText)
        }
    }
}).bind(req, this);
使用bind函数,您可以将固定的
对象以及部分或全部参数指定给函数


您已经可以使用
req
变量访问
XMLHttpRequest

如果您喜欢更干净的方式,可以将请求绑定到回调函数lite,以便:

req.onreadystatechange = (function ( request: XMLHttpRequest, event: Event ): any {
    if (request.readyState === XMLHttpRequest.DONE) {
        if (request.status === 200) {
            this.render(request.responseText)
        }
    }
}).bind(this, req);
或者反过来说:

req.onreadystatechange = (function ( myClassObject: MyClass, event: Event ): any {
    if (this.readyState === XMLHttpRequest.DONE) {
        if (this.status === 200) {
            myClassObject.render(this.responseText)
        }
    }
}).bind(req, this);
使用bind函数,您可以将固定的
对象以及部分或全部参数指定给函数


在给定的上下文中,
只有一个值。它不能同时引用请求和类。由于您使用了双箭头函数,类上下文被传递,因此
this
引用了类,而
this.readyState
可能未定义。如果这是一个简单的JS问题,我会将其记为“箭头函数的另一个不适当使用”问题,但是我不知道TypeScript是否有区别。在给定的上下文中,
这个
只有一个值。它不能同时引用请求和类。由于您使用了双箭头函数,类上下文被传递,因此
this
引用了类,而
this.readyState
很可能未定义。如果这是一个简单的JS问题,我会将其记为“又一次不适当地使用箭头函数”问题,但我不知道TypeScript是否在这方面起了作用。不,根本不要使用
bind
。用于关闭
this
req
的箭头函数是最干净的。这种对
bind
的一般禁止在纯ES6环境中可能是正确的,但在混合或纯ES5环境中可能不正确。当然,但即使如此,绑定
req
也是一个坏主意,尤其是在顺序混乱的情况下。此外,OP已经很好地使用了arrow函数(无论是否使用transpiler,这都无关紧要)。在某些情况下,这可能很方便。在这个极小的例子中,可能不需要绑定<代码> Req,但是考虑在循环中创建多个请求(不让…没有好的TrpSHILE方法…)。绑定会很方便。不,根本不要使用
bind
。用于关闭
this
req
的箭头函数是最干净的。这种对
bind
的一般禁止在纯ES6环境中可能是正确的,但在混合或纯ES5环境中可能不正确。当然,但即使如此,绑定
req
也是一个坏主意,尤其是在顺序混乱的情况下。此外,OP已经很好地使用了arrow函数(无论是否使用transpiler,这都无关紧要)。在某些情况下,这可能很方便。在这个极小的例子中,可能不需要绑定<代码> Req,但是考虑在循环中创建多个请求(不让…没有好的TrpSHILE方法…)。装订会派上用场的。