human
JavaScriptでは、なぜ矢印関数内の「この」キーワードの値が、それがどのように呼ばれるかではなく、作成されたコンテキストによって決定されるのですか？
gpt
JavaScriptでは、矢印関数内のこのキーワードの値は、矢印関数にこの結合が語彙的であるために作成されたコンテキストによって決定されます。

通常の関数とは異なり、矢印関数には独自のキーワードがなく、代わりに周囲のコンテキストからこの値を継承します。これは、矢印関数内のこれの値が、矢印関数が定義されているときに決定されることを意味します。

これは、JavaScriptで矢印関数がどのように使用されるか、特に関数の呼び出に応じてこの値が変化する状況では、多くの意味があります。矢印関数を使用することにより、関数が呼び出される方法に関係なく、この値が常に同じままであることを確認できます。

たとえば、次のコードを検討してください。

const obj = {
  名前：「ジョン」、
  挨拶：function（）{
    setimeout（function（）{
      console.log（ `こんにちは、私の名前は$ {this.name}`）;
    }、1000）;
  }
};

obj.greet（）;//「こんにちは、私の名前は未定義です」


このコードでは、SettimeOutコール内の通常の関数には、周囲のオブジェクトOBJではなく、この場合はウィンドウ（または厳密なモードでは未定義）である（または厳密なモードでは未定義）によって決定される独自の値があります。これにより、「こんにちは、私の名前は未定義です」というエラーが発生します。

ただし、代わりに矢印関数を使用する場合、この値は次のように、周囲のオブジェクトOBJから継承されます。

const obj = {
  名前：「ジョン」、
  挨拶：function（）{
    setimeout（（）=> {
      console.log（ `こんにちは、私の名前は$ {this.name}`）;
    }、1000）;
  }
};

obj.greet（）;//「こんにちは、私の名前はジョンです」


このコードでは、SettimeOutコール内の矢印関数は、周囲のオブジェクトOBJからこの値を継承します。
human
代わりにTypeScriptコードを使用している場合、動作は変わりますか？「This」オブジェクトはどのタイプですか？さらに、私たちが非同期関数にあるとき、「このオブジェクトはどのように動作しますか？
gpt
TypeScriptは、JavaScriptの厳格なスーパーセットです。これは、JavaScriptコードのスニペットも有効なタイプスクリプトコードであり、常にまったく同じ動作をすることを意味します。このため、矢印関数内の「このキーワード」の動作は変更されません。これはまた、矢印関数の「これ」のタイプが常に定義されたコンテキストのタイプであり、通常の関数の「この」のタイプは、それが呼び出されたコンテキストのタイプになることを意味します。
 前の例では、「This」はおそらく、ウィンドウオブジェクトにはタイプの注釈がないため、通常の関数ケースのタイプ「any`」にデフォルトであり、タイプ `{name：string;Greet：（）=> void;} `矢印関数を使用する場合。

非同期関数を使用する場合、「この」キーワードは、通常のJavaScript関数と同じように動作します。ただし、同期コンテキストから非同期関数を呼び出すと、新しいコンテキストが作成され、この新しいコンテキストから関数が呼び出されるため、注意する必要があります。これが、矢印構文を使用して非同期関数を定義し、「これ」の値を保持することが一般的である理由です。また、「This」の値をFuctionの議論に結合し、代わりにそれを使用することもできます。

Settimeout（）の最初の引数は、実際にはタイマーの有効期限が切れた後に新しいコンテキストから呼び出される非同期関数であるため、最初のメッセージの例を参照できます。矢印関数を使用せずに同じ結果を得る別の方法は、次のことを行うことです。

const obj = {
  名前：「ジョン」、
  挨拶：function（）{
    setimeout（function（that：{name：string}）{
      console.log（ `こんにちは、私の名前は$ {that.name}`）;
    }、1000、this）;
  }
};

obj.greet（）;//「こんにちは、私の名前はジョンです」

この場合、「this」の値は、コンテキストsetimeout（）の `this`balueにアクセスできる非同期関数の引数` that`に拘束されます。