【发布时间】:2012-12-03 12:30:54
【问题描述】:
我有一个成员函数render()。此函数调用类 add(any) 的另一个成员。这是sn-p。
render(){
collection.each(this.add);
}
如果我在add中使用关键字“this”,则类型为window。我希望它是成员类的实例。
在构造函数、成员函数或成员访问器中,这是包含类的类实例类型。
【问题讨论】:
标签: typescript
我有一个成员函数render()。此函数调用类 add(any) 的另一个成员。这是sn-p。
render(){
collection.each(this.add);
}
如果我在add中使用关键字“this”,则类型为window。我希望它是成员类的实例。
在构造函数、成员函数或成员访问器中,这是包含类的类实例类型。
【问题讨论】:
标签: typescript
正如 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));
}
【讨论】:
我不认为这是一个错误。
您不再在render() 函数的范围内,而是在each() 的范围内。
试试这个:
render(){
var that = this;
collection.each(that.add);
}
【讨论】:
each(),而不是render())。闭包作用域是 JS 的基本特征,因此也是 TS。无论如何,它可能是您(和 OP)不喜欢的 feature,但它肯定是故意的,并且符合已发布的规范,因此根据定义,它不是 >错误。太多关于 SO、IMO 的帖子在其标题中大肆宣传明显的“错误”:这是一个应该更加小心使用的术语。
me? - that? - 它始终指向类实例,而不是已分配相关方法的对象。