我有一个用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对象作为上下文来调用它,或者使用callapply显式设置上下文,或者使用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();

10-06 02:30