传递对方法的引用时,此上下文丢失

时间:2017-02-09 23:33:56

标签: javascript typescript ecmascript-6

在这个例子中

class Car {
    describe() {
        console.log("I have " + this.wheels);
    }

    testMe() {
        setTimeout( this.describe, 1000);
    }

    constructor(wheels) {
        this.wheels = wheels;
    }
}

let myCar = new Car(4);
myCar.testMe(); // I have undefined

为什么this的预期值未在describe函数内传递?

编辑:你能否确认setTimeout是箭头函数,我不会得到undefined

1 个答案:

答案 0 :(得分:0)

裸函数引用没有上下文,即使它是作为对象的属性检索的。

testMe功能中,您需要:

setTimeout(() => this.describe(), 1000);

setTimeout(this.describe.bind(this), 1000);

let self = this;
setTimeout(function() {
    self.describe();
}, 1000);

当然,最后一个可以写成箭头函数,但如果你这样做,你也可以使用第一个版本,不需要this的本地副本。

关于你的编辑, 可以只通过this.describe通过构造函数内部分配的箭头函数来传递describe,但请注意,这意味着每一个该对象的实例将拥有自己的该函数副本,而不是仅仅是该类的prototype上的单个副本:

constructor(wheels) {
    this.wheels = wheels;

    this.describe = () => {
        console.log("I have " + this.wheels);
    }
}