2017-01-31 51 views
2

我有一个函数,调用它meow(),作为一类的一部分,称之为Cat如何在传递函数时保持'this'的原始范围?

export class Cat(){ 

    private meow(){ 
     console.log(this); 
    } 

现在,说我有另一个类,称之为Kitten,这需要一个函数作为其构造的一部分:

export class Kitten { 

    var kittenMeow: {(): void; }; //note the typing 

    constructor(functionForMeow : {(): void; }){ //note the typing 
     this.kittenMeow = functionForMeow; 
    } 

    public meow(){ 
     this.kittenMeow(); 
    } 
} 

现在说我添加以下到Cat类:

export class Cat(){ 

    constructor(){ 
     this.giveBirth(); 
    } 

    private meow(){ 
     console.log(this); 
    } 

    giveBirth(){ 
     var kitty = new Kitten(this.meow); 
     kitty.meow(); 
    } 
} 

当我运行此代码时,“Kitten”被记录到控制台。我怎样才能让“猫”登录到控制台?也就是说,我怎么保存的this原来的范围,使thisCat而不是Kitten

回答

1

您可以使用.bind() method,以便在当前范围内指定的this值。然后当执行该功能时,this将参考Cat而不是Kitten

var kitty = new Kitten(this.meow.bind(this)); 

换句话说,由于thisCatgiveBirth方法范围内,也就是在其他范围执行所述功能时所传递的值。

export class Cat { 
    giveBirth() { 
    var kitty = new Kitten(this.meow.bind(this)); 
    kitty.meow(); 
    } 
} 
+0

我还想补充一点,TypeScripts'胖箭头'不会捕获'this',你可以用'this'注释回调类型来显式地要求这是一个特定的类型。参考:https://www.typescriptlang.org/docs/handbook/functions.html#this – shusson

相关问题