我有一个用TypeScript编写的服务。就像是:
export default class AServiceClass {
constructor(private $http: ng.IHttpService, ...) {}
method1(data : any) : void {
this.$http(...)
}
method2(data : any) : void {
this.$http(...)
}
}
我有一个控制器类,可以利用此服务:
export default class AControllerClass {
constructor(private aService: AServiceClass, ...) {}
$onInit(){
let method = true ? this.aService.method1 : this.aService.method2;
method({ ... data ... });
}
}
服务方法引发异常-
this is undefind
。如果我像this.aService.method1({ ... data ... })
那样使用它,一切都很好。 Ofc我可以使用method.bind(aService)({ ... data ... })
或method.call(aService, { ... data ... })
,但是为什么存在范围差异?谢谢。
最佳答案
您的method1
方法在没有上下文的情况下被调用,因此其中的this
将是未定义的。您必须使用aService
对象作为上下文来调用它,或者使用call
或apply
显式设置上下文,或者使用bind
显式绑定上下文:
this.aService.method1(); // `this` will be aService inside `method1`
method.call(aService, args);
method.apply(aService, [args]);
// Or bind using `bind`:
let method = true ? this.aService.method1.bind(this.aService) : this.aService.method2.bind(this.aService);
method();