【问题标题】:The this keyword in typescript. Is it a bug?打字稿中的 this 关键字。它是一个错误吗?
【发布时间】:2012-12-03 12:30:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

    正如 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));
    }
    

    【讨论】:

      【解决方案2】:

      我不认为这是一个错误。

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

      试试这个:

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

      【讨论】:

      • IMO,这是一个错误,但在 TypeScript 语言定义中。类中的“this”应该是指类实例,句号。 JavaScript 根据调用方法的方式改变“this”所指的内容的方式是其最严重的错误之一(在充满这些错误的语言中)。如果 TypeScript 想成为 JavaScript 的真正超集,它不能为普通方法改变它,但它可以而且绝对应该为类方法改变它。
      • 但是你在一个回调闭包中(each(),而不是render())。闭包作用域是 JS 的基本特征,因此也是 TS。无论如何,它可能是您(和 OP)不喜欢的 feature,但它肯定是故意的,并且符合已发布的规范,因此根据定义,它不是 >错误。太多关于 SO、IMO 的帖子在其标题中大肆宣传明显的“错误”:这是一个应该更加小心使用的术语。
      • 同意这不是实现中的错误 - 只是在规范中:-)。也许解决方法(在规范级别)将是一个不同的关键字 - me? - that? - 它始终指向类实例,而不是已分配相关方法的对象。
      • 当您说规范有“错误”时,您再次错误地使用了“错误”一词。规范可能有错误,但规范不能有错误,因为规范不是代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 2016-08-22
      • 2021-06-08
      • 2020-06-09
      • 2016-08-18
      相关资源
      最近更新 更多