2017-06-18 7 views
-1

最近私はチュートリアルでこれらの機能を見てきました。彼らは同等ですか?これらの関数は同等ですか?

(_ => console.log(1))(); 

(() => console.log(1))(); 
+1

等価です。どちらもコンソールに「1」を出力します。 – Pointy

+0

しかし、なぜ匿名関数として_と()を使用するのが同じですか?なぜ_を使用するのですか? – James

+1

これは簡潔にするために書かれていることがあります。それは通常「無視される」ことを意味します。 – Ben

答えて

1

2つの機能はまったく同じことを行います。唯一の違いは、先頭の関数は1つのパラメータ_をとり、もう1つはゼロをとることです。この例では、_変数を使用しないため、これは問題ではありません。

ただし、変数名に_を使用していて、それを関数で使用すると、問題が発生します。例:

(_ => console.log(_))(); 

は最初の行で

(() => console.log(_))(); 

と同じものではない、関数は値が渡されないので、この場合には、undefinedあり、パラメータ_、の値を出力しますそれに。 2行目では、関数はグローバル変数_の値を出力します。これは、変数_が使用されているunderscore.jsのようなライブラリを使用すると問題になります。

+1

両方とも同じ出力を内部的に生成しますが、それらは異なっていますが、正しいですか? – James

1

「脂肪矢印」(=>)関数は、単一の識別子パラメータ名で、またはゼロ以上のパラメータの括弧リストを宣言することができます。あなたの最初の例

(_ => console.log(1))(); 

は、パラメータ名が "_"の最初の場合です。第二の例では、パラメータなしで、パラメータリストである:

(() => console.log(1))(); 

どちら関数はそのパラメータを利用して、両方の呼び出しは、パラメータを渡しません。つまり、両方の関数呼び出しには実際の引数はありません。両方のステートメントは()で終わります。 2つが「同等」であるかどうかは、「等価」の定義に依存します。どちらの場合も、まったく同じことが起こります。しかし、匿名の太矢印の関数はまったく同じではありません。

+1

Erlangプログラミング言語では、明示的に「無視された」とみなされるパラメータはアンダースコアで始まります。楽しい事実。 – Pointy

+0

知っておいてよかったです、ありがとう! – James

0

いいえ、これらは同等ではありません。最初のものは1つのパラメータを持つ匿名の太矢印の関数であり、2つ目のパラメータは0のパラメータを持つ匿名の太字の矢印の関数です。したがって、最初の関数は、関数に引数をあまり渡すことがECMAScriptのエラーではないという事実に依存しています。

アンダースコア_は、特定の契約を満たすために必要なパラメータを示すために使用されることがありますが、実際には無視されます。しかし、この場合は、パラメータが必要でないため、この規約の悪用となる:必須:関数は引数なしで呼び出されるため、パラメータを宣言する必要はありません。

関連する問題