関数を変数に割り当てることの利点は何ですか?


回答:


8

私が信じる短い答えは、単に名前付き関数を作成するのではなく、変数に割り当てられた無名関数を作成しているということです...

    function sum() {}

違いを確認する良い方法は、それらの.ToString()を呼び出して違いを確認するか、console.log(sum.name)を実行することです。1つは実際の名前を付け、もう1つは無名関数(varに割り当てられたもの)を付けます。var sum = function(){}が実行時に定義され、関数sum(){}が解析時に定義されるように、詳細もあります。


最後の文で言っているのは、varで定義されている上記の前の行でsum()を呼び出そうとすると、エラーが発生するということです。それが私の回答のように定義されている場合、呼び出しが関数の上にあったとしても、エラーは発生しません。
ハーモニック

12
それが違いを説明していますが、利点を説明しているとは思いません。
Keith Thompson

解析時間とランタイムの違いは何ですか?
Anchetaを2012

1
名前付き関数とは何の関係もありませんが、名前付き関数を変数に割り当てることができます
Juan Mendes

5

1つの利点は、ブロック内で関数宣言を使用できないことです。それらは、ファイルの最上位にあるか、別の関数内に直接置くことができます。

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

これらはすべて標準では規定されておらず、ブラウザはさまざまなことを行います。/programming/10069204/function-declarations-inside-if-else-statementsを参照してください。したがって、他のスタイルを使用する必要がある場合は、一貫性を保つために常に使用することをお勧めします。

また、私はこれについては確信がありませんが、もし私が正しく覚えていれば、いくつかの古い縮小記号は、関数宣言を処理し、名前を変更するほど賢くありませんでした。


3

私はJavascriptのエキスパートではないので、これを少しずつ理解してください。私は、場合によってはスタイルのためにそれを行うかもしれず、同じことは単に「関数sum(){...}」を書くことで達成できると思う

ただし、関数を変数に割り当てることは、関数型プログラミングにおいて非常に強力な手法です。OOPに精通している場合、それは多態性にいくぶん似ています。動物の基本クラスと猫/犬の派生クラスの古典的な例を考えてみてください。Animalで動作するコードを記述できますが、関数を呼び出すと、その関数はインスタンスのタイプに応じて異なる動作をする可能性があります。

関数型プログラミングでは、「関数」で機能するアルゴリズムを使用できますが、変数を使用してその関数を呼び出す場合は、実行時に別の関数を柔軟に割り当てることができます。

たとえば、幅500ピクセルのウィンドウに10,000データポイントを表示するアルゴリズムを作成するとします。次に、各ピクセルは20個のデータポイントを表し、それらを表示するには、それらの20個のデータポイントを1つの値に集約する必要があります。

したがって、10,000ポイントを提示するアルゴリズムを定義し、このアルゴリズムが次のように集約と呼ばれる関数変数を使用するとします。

...
displayValue = aggregate( numbersInOnePixel );
...

これで、実行時にユーザーはデータの集計方法を選択できます。実際の関数変数は、次のいずれかになります。

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}

0

違いが現れる唯一の状況(すべての宣言を終了する前にいくつかの関数を呼び出す、toStringメソッドを使用する)は、私の意見では、一種のコーナーケースであるため、そのほとんどはスタイルの問題です。

このvar =スタイルをサポートしていると私が聞いた議論の1つは、通常の変数を宣言する方法と一貫しているということです。これにより、使用する言語機能の数が制限され、JavaScriptを初めて使う人にプログラムを導入するのが簡単になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.