打字稿中的this关键字.这是一个错误吗?

use*_*545 7 typescript

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

render(){
    collection.each(this.add);
}
Run Code Online (Sandbox Code Playgroud)

如果我在添加中使用关键字"this",则类型为window.我希望它是成员类的实例.

在构造函数,成员函数或成员访问器中,这是包含类的类实例类型.

Joh*_*yHK 16

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

但是,如果你使用'胖箭头'匿名函数,它将使用词法范围规则,this以便你得到你想要的东西:

render(){
    collection.each((x) => this.add(x));
}
Run Code Online (Sandbox Code Playgroud)

编译为以下JavaScript:

X.prototype.render = function () {
    var _this = this;
    collection.each(function (x) {
        return _this.add(x);
    });
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是明确bindadd调用所需this:

render(){
    collection.each(this.add.bind(this));
}
Run Code Online (Sandbox Code Playgroud)


Jud*_*her 4

我不认为这是一个错误。

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

尝试这个:

render(){
    var that = this;
    collection.each(that.add);
}
Run Code Online (Sandbox Code Playgroud)

  • IMO,这是一个错误,但在 TypeScript 语言定义中。类中的“this”应该指的是类实例,句号。JavaScript 根据方法的调用方式来改变“this”指向的内容,这是它最严重的错误之一(在充满这种错误的语言中)。如果 TypeScript 想成为 JavaScript 的真正超集,它无法改变普通方法的这一点,但它可以而且绝对应该改变类方法的这一点。 (6认同)
  • 同意这不是实现中的错误 - 只是在规范中:-)。也许解决方法(在规范级别)是一个不同的关键字 - “me”?- ‘那个’?- 它总是指向类实例,而不是指向所分配的方法的对象。 (5认同)
  • 但是您处于回调闭包(“each()”,而不是“render()”)中。闭包作用域是 JS 的基本特征,因此也是 TS 的基本特征。无论如何,这可能是您(和OP)不喜欢的“功能”,但它肯定是有意为之,并且符合已发布的规范,因此根据定义,它不是“错误”。太多关于 SO、IMO 的帖子在其标题中鼓吹明显的“错误”:这个术语应该更加小心地使用。 (4认同)