私は、メンバー関数render()を持っています。この関数は、クラスadd(any)の別のメンバーを呼び出します。これがスニペットです。thisキーワードはtypescriptにあります。バグですか?
render(){
collection.each(this.add);
}
追加でキーワード「this」を使用すると、タイプはウィンドウになります。私はそれがメンバークラスのインスタンスであると期待しています。
コンストラクタ、メンバ関数、またはメンバアクセサでは、これは含まれるクラスのクラスインスタンス型です。
IMO、バグですが、TypeScript言語の定義です。クラス内の "this"は、クラスインスタンス、periodを参照する必要があります。メソッドが呼び出される方法に応じてJavaScriptが "this"が指しているものを変更する方法は、その最悪のミスの1つです(それらの言語でいっぱいです)。 TypeScriptがJavaScriptの本当のスーパーセットになりたければ、通常のメソッドではそれを変更することはできませんが、クラスメソッドではそれを絶対に変更する必要があります。 –
しかし、 'render()'ではなく 'each()'のコールバッククロージャの中にいます。クロージャスコープはJSの基本的な特徴であり、したがってTSです。とにかく、あなた(そしてOP)が好きではないが、確かに意図的で、公開された仕様を満たしているので、定義上はバグ*ではないかもしれません。 SO、IMOにはあまりにも多くの記事が掲載されていますが、彼らのタイトルには明らかな「バグ」があります。それはもっと注意を払って使うべき用語です。 – JcFx
実装上のバグではないという合意がなされました。おそらく(スペック・レベルの)回避策は、別のキーワード、「私」でしょうか? - それ? - 常にクラスインスタンスを指し、問題のメソッドが割り当てられたオブジェクトではありません。 –