human
JavaScriptでは、なぜ矢印関数内の「この」キーワードの値が、それがどのように呼ばれるかではなく、作成されたコンテキストによって決定されるのですか？
gpt
JavaScriptでは、従来の関数内の「この」キーワードの値は、宣言された場所ではなく、関数がどのように呼び出されるかによって決まります。ただし、矢印関数では、「この」の値は、矢印関数が作成されるコンテキストによって決定されます。動作の違いは、矢印関数が「これ」を処理するように設計されている方法によるものです。

匿名関数を書くためのより簡潔な構文として、ecmascript 6に矢印関数が導入されました。従来の関数とは異なり、矢印関数には独自の「この」値がありません。代わりに、周囲の範囲から「この」値を継承します。これは、矢印関数内の「この」値は、矢印関数が作成されたコンテキストによって、それがどのように呼ばれるかによってではなく、作成されるコンテキストによって決定されることを意味します。

この動作の理由は、特に関数がコールバック関数として使用されている場合、または他の関数への引数として渡される場合、関数内の「この」のより予測可能で一貫した動作を提供するためです。これらの場合、従来の関数内の「これ」の値は、関数の呼び出方に応じて変更できるため、予測不可能です。

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

JavaScript

const obj = {
  名前：「ジョン」、
  sayhello：function（）{
    setimeout（function（）{
      console.log（ `hello、$ {this.name}`）;
    }、1000）;
  }
};

obj.sayhello（）;//ログ「こんにちは、未定義」

この例では、SettimeOutに渡された関数は、周囲のSayhello関数とは異なる「この」値を持ちます。これにより、予期しない動作につながり、目的の値へのアクセスが困難になります。

矢印機能を使用すると、この問題を回避できます。

JavaScript

const obj = {
  名前：「ジョン」、
  sayhello：function（）{
    setimeout（（）=> {
      console.log（ `hello、$ {this.name}`）;
    }、1000）;
  }
};

obj.sayhello（）;//ログ「こんにちは、ジョン」

この例では、矢印関数は周囲のSayhello関数の「この」値を保持し、より予測可能で一貫した動作を提供します。

結論として、矢印関数内の「これ」の値は、JavaScriptの「この」のより予測可能で一貫した動作を提供するために、それがどのように呼ばれるかではなく作成されたコンテキストによって決定されます。