2

_thisこれは非常に工夫された例ですが、クラス関数のどこかに変数を作成するとします。

class Person {
  constructor (public name : string) {}
  changeName(name) {
    var _this = {};
    (() => {
      this.name = name;
    })();
  }
}

changeNameコンパイルされたコードの関連部分は次のようになっているため、関数を呼び出すと、これは期待どおりに機能しません。

var _this = this;
var _this = {};
(function () {
  _this.name = name;
})();

これは悪いJavascriptです。2つのvar宣言が互いに上書きしています。コンパイラによって作成されたものは、私の_thisによって上書きされてい_thisます。

私が見る限り、この動作はTypeScript仕様では指定されていません。

なぜ彼らは対立する必要がありますか?コンパイラーは、変数とコンパイラーで生成された変数が互いに踏みつけられない_thisようにするなど、自動生成された変数に名前を付けて名前を付けたかどうかを検出できませんか?_this2

4

2 に答える 2

7

コンパイラーは、ラムダ構文を使用して作成されるクロージャーを容易にするための_this参照として自動的に作成します。thisTypeScript仕様のどこかでこれを読んだことは間違いありませんが、この場合、コンパイラーがエラーを発行することに同意します。

「慣用的な」(したがって予測可能な)javascriptを生成するという目標と矛盾するため、コンパイラがjavascriptの出力方法を変更するという考えは好きではありません。

于 2012-10-03T14:27:00.853 に答える
0

それはあなたが予約変数と呼ぶものではありませんか?「this」または「document」という変数も宣言しないと思います。

MSが予約変数が何であるかを明確にしている限り、大きな問題はないと思います。ただし、警告を出力するようにコンパイラを改善できる可能性があります。

于 2012-10-03T14:27:29.857 に答える