有什么区别:
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答案 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));
}
类型注释任何内容。
我希望有所帮助。