7

我有一个成员函数render()。此函数调用类 add(any) 的另一个成员。这是片段。

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

如果我在add中使用关键字“this”,则类型为window。我希望它是成员类的实例。

在构造函数、成员函数或成员访问器中,this 属于包含类的类实例类型。

4

2 回答 2

16

正如 JcFx 指出的那样,您的this范围在each回调中是不同的。

但是,如果您使用“胖箭头”匿名函数,它将使用词法范围规则,this以便您获得所需的内容:

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

编译为以下 JavaScript:

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

另一种选择是显式bind调用add所需的this

render(){
    collection.each(this.add.bind(this));
}
于 2012-12-03T15:54:54.297 回答
4

我不认为这是一个错误。

您不再在render()函数的范围内,而是在each().

尝试这个:

render(){
    var that = this;
    collection.each(that.add);
}
于 2012-12-03T12:47:34.857 回答