我试图通过引用调用一个函数。一切都始于类callMe()
的{{1}}:
DynamicCalls
我希望第三个通话interface IDynamicFunction {
name: string;
func: (param: string) => void;
}
class DynamicCalls {
private dynamicCall: IDynamicFunction = { name: "myDynamic", func: this.testFunc };
public callMe() {
this.callFromDynamic("Works"); // 1st -> Works
this.testFunc("Works, also"); // 2nd -> Works
this.dynamicCall.func("First Call"); // 3rd -> Error: callFromDynamic seems to be unknown in testFunc
}
private callFromDynamic(param: string): void {
console.log("Param: " + param);
}
private testFunc(param: string): void {
console.log("Param: " + param);
this.callFromDynamic("Second call"); // Gives error -> TypeError: this.callFromDynamic is not a function
}
}
let dynamicCalls: DynamicCalls = new DynamicCalls();
dynamicCalls.callMe();
的工作方式像(this.dynamicCall.func("First Call");)
。
有人可以向我解释为什么我得到这个this.testFunc("Works, also")
吗?以及如何避免呢?
非常感谢。
亲切的问候, 奥基恩
答案 0 :(得分:2)
问题是您丢失了上下文。
在您的情况下,this
指向同一对象:{name: string, func: Function}
因此您可以使用:
private dynamicCall: IDynamicFunction = {
name: "myDynamic",
anotherFun: () => console.log('another func'),
func: this.anotherFun()
};
尝试:
private dynamicCall: IDynamicFunction = {
name: "myDynamic",
func: (param: string) => this.testFunc(param)
};
答案 1 :(得分:0)
@MaximP是正确的,但是还有另一种解决方案。
private callFromDynamic = (param: string): void => {
console.log("Param: " + param);
};
private testFunc = (param: string): void => {
console.log("Param: " + param);
this.callFromDynamic("Second call");
};
将您的函数更改为字段,现在它们将保留其上下文,而无需包装其调用。