方法x TypeScript中的胖箭头

时间:2017-03-23 23:09:05

标签: typescript angular-promise

有什么区别:

export class Test {

  x: any;

  processData = (data) => {
    console.log("This=",this);
    this.x = data; 
    console.log("Loaded.", data);
  }
}

和此:

export class Test {

 x: any;

 processData(data) {
  console.log("This=",this);
  this.x = data; 
  console.log("Loaded.", data);
 }

}

对于最后一个,在以下代码中:

 ionViewLoaded() {
   console.log("## ionViewDidLoad");
   this.myApi.getPromise().then(this.processData);
 }

函数ionViewLoaded()不起作用,因为在processData()

中这个== null

1 个答案:

答案 0 :(得分:2)

在第二个示例中,

this严格模式下实际上是=== undefined。不同之处在于,所有箭头函数都关闭了创建它们的作用域的词法this值。

在你的第一个例子中:

export class Test {

  x: {}; // Please stop using any.

  processData = (data) => {
    console.log("This=", this);
    this.x = data; 
    console.log("Loaded.", data);
  }
}

当你定义一个实例属性时,词汇上下文是封闭类的实例不是一个原型方法,其值是一个箭头函数关闭。

在第二个例子中:

export class Test {

  x: {};// Please stop using any.

  processData(data) {
    console.log("This=", this);
    this.x = data; 
    console.log("Loaded.", data);
  }

}

您正在类原型上创建方法。一个方法有一个动态范围这个引用,它在调用它时会在调用时被绑定。

如果您将其称为object.method(),则this会在object内引用method进行该调用和该调用。

如果您将其称为method(),即没有接收对象,,如果您在严格模式下运行,那么undefined将在{{1}内对于该调用和仅调用。

如果你在严格模式下运行,这将引用全局对象。例如,在浏览器中,它将引用method。这真是太糟了。始终以严格模式运行。

代码隐含在ES模块和类主体内部的严格模式中。您可以通过使用window指令序言开始封闭文件或封闭函数来显式设置严格模式。

这就是为什么代码在第二个示例中失败的原因,因为'use strict';未定义。要将方法作为回调传递,您需要首先绑定它。 也就是说你会写

this

或者,您可以创建一个箭头函数,该函数关闭实例和使用站点上的方法,如

ionViewLoaded() {
  console.log("## ionViewDidLoad");
  this.myApi.getPromise().then(this.processData.bind(this));
}

或者只使用绑定到属性的箭头函数,如第一个示例所示。

哦,如果评论没有给你提示,请不要使用ionViewLoaded() { console.log("## ionViewDidLoad"); this.myApi.getPromise().then(data => this.processData(data)); } 类型注释任何内容。

我希望有所帮助。