Nyckelordet this i TypeScript. Är det ett fel?


Jag har en medlemsfunktion render(). Denna funktion anropar en annan medlem i klassen add(any). Detta är utdraget.

render(){
    collection.each(this.add);
}

Om jag använder nyckelordet "this" i add, är typen window. Jag skulle förvänta mig att det är instansen av medlemsklassen.

I en konstruktor, medlemsfunktion eller medlemsåtkomst är this av klassinstanstypen för den omgivande klassen.

Svar #1

Som JcFx påpekar, är din this-omfång olika inom each-callbacken.

Men om du använder en 'fat arrow'-anonym funktion, kommer den att använda lexikala scoping-regler för this så att du får det du letar efter:

render(){
    collection.each((x) => this.add(x));
}

Kompileras till följande JavaScript:

X.prototype.render = function () {
    var _this = this;
    collection.each(function (x) {
        return _this.add(x);
    });
}

Ett annat alternativ är att uttryckligen bind anropet add till det önskade this:

render(){
    collection.each(this.add.bind(this));
}

Svar #2

Jag tror inte att det är ett fel.

Du är inte längre inom omfattningen av render()-funktionen, utan istället inom omfattningen av each().

Prova detta:

render(){
    var that = this;
    collection.each(that.add);
}

Relaterade artiklar