Below is an instruction that describes a task. Write a response that appropriately completes the request.

### Instruction:
User:JavaScriptの関数を宣言する正しい方法は何ですか？ Assistant:JavaScriptの関数を宣言する1つの正しい方法はありません。これは、それを実現するための異なる構文があるためです。JavaScriptで関数を宣言する3つの最も一般的な方法は次のとおりです。

1.機能の宣言：
「JavaScript
ミフィクション関数（param1、param2）{
  //実行されるコード
}
``

2.関数式：
「JavaScript
var mifuncion = function（param1、param2）{
  //実行されるコード
};
``

3.矢印関数：
「JavaScript
var mifuncion =（param1、param2）=> {
  //実行されるコード
};
``

これらの各フォームには独自の利点と短所があり、選択は記述されているコードの特定のニーズに依存します。たとえば、関数宣言により、コード内の定義の前に関数を呼び出すことができます。これは、場合によっては役立ちます。一方、矢印関数はより簡潔で、状況によっては読みやすくなります。

最終的に、JavaScriptで関数が宣言される方法は、好ましいコーディングスタイルとそれが使用されるコンテキストに依存します。重要なことは、関数がコードの機能と読みやすさの要件を満たす方法で宣言されることです。 
User:「これ」の値は、特に矢印の形の表記が使用する場合、関数が宣言された方法によって異なることに気付きます。なぜこれが起こるのか説明してもらえますか？どちらか別の表記法はいつ使用する必要がありますか？関数を宣言するさまざまな方法に関連する違いはありますか？

### Response:

JavaScriptの矢印関数における「this」の値の動作は、矢印関数には「this」の語彙リンクがあるため、従来の関数の動作とは異なりますが、従来の関数には「this」の動的リンクがあります。

矢印関数では、「this」の値は、関数が配置されている語彙または範囲のコンテキストから継承されます。つまり、矢印関数内の「これ」は、周囲の球体の「this」の値を指します。機能はあります。言い換えれば、矢印関数における「これ」の値は、その定義時に決定され、関数が何と呼ばれているかに関係なく、実行時間が変化しません。

一方、従来の関数では、「this」の値は実行時間内に動的に確立され、関数が何と呼ばれるかに依存します。従来の関数における「これ」の値は、関数を呼び出すオブジェクトに応じて決定されます。これは、コールコンテキストに応じて変更できます。

では、JavaScriptで矢印関数を使用する必要があるコンテキストは何ですか？

1.関数を変更せずに、親分野の「これ」の値が必要な場合。これは、親オブジェクトまたはクラスのインスタンスへの参照を維持したい状況で特に役立ちます。

2.「Map」、「Filter」、「Reduce」などの配列メソッドの引数として使用されるコールバックまたは関数。このリンクテクニックを使用せずに周囲のスコープの変数にアクセスする必要があります。

3.小規模および匿名関数のために、より簡潔で読みやすい構文を持つことを目指している状況で。

JavaScriptの機能を宣言するさまざまな方法の間の他の関連する違いについては、次のようなものがあります。

1.「引数」：矢印関数では、新しい「引数」オブジェクトは作成されません。一方、矢印関数は、最も近い父親関数の議論を継承します。ただし、従来の関数では、関数に渡された引数を含む新しい「引数」オブジェクトが作成されます。

2.「スーパー」：矢印関数では、「スーパー」は利用できません。従来の機能では、「スーパー」とは、プロトタイプチェーンの父親のオブジェクトを指します。

3.「new.target」：矢印関数では、「new.target」は利用できません。従来の機能では、「new.target」は、「new」で呼び出された構造関数を指します。

これらの違いを理解し、あなたのニーズとコードの「これ」の望ましい動作に最適な機能の宣言の形式を選択することが重要です。