2016-07-05 6 views
5

通常の関数とES6矢印関数の文脈の違いが大きく異なるため、コールバックfnで受け取った関数を知ることができます。コールバック関数がES6矢印であるかどうかを調べる

typeofreturnfunction(両方とも)です。区別する方法はありますか?

+3

APIを設計している場合は、両方で一貫して動作するはずです。たとえば、ユーザーがコードをリファクタリングすると考えると、渡された関数に基づいて関数のシグネチャが実際に変更されると思いますか?わたしは・・・しないだろう。また、検出された検出方法は矢印付き矢印機能では失敗する可能性があるので、実行中の環境に応じてコードの動作が変わることに注意してください。 – loganfsmyth

+0

なぜ違いを知りたいのですか? –

+0

コールバックの受信者には全く違いはありません。単純にすべてのタイプのコールバックを呼び出すことができます。 – Bergi

答えて

6

矢印機能はコンストラクタとして使用できず、undefinedとしてtypeof arrowFunc.prototypeと表示されますが、非矢印機能は「オブジェクト」を示します。

+0

Chromebook Chrome 51.0.2704.103で、 'x = function(){return 1;};で作業していることを確認しました。 y =(()=> 1)。 – Paul

+0

これは[this fiddle](http://www.es6fiddle.net/iqa214ua/)の両方で 'object'を返しています。 。 – daniloprates

+0

hmmm通常の関数にコンパイルしているので、Babelではうまくいきません:/ /しかし、ソリューションのおかげで、コンパイラが問題ではないときには最良の方法と思われます。 – daniloprates

2

Function.toString()を使用すると、関数のソースコードの文字列表現を返し、その文字列の矢印(=>)を検索できます。

var arrowFunc = x => 2 * x 
var regFunc = function (x) {return 2 * x} 

arrowFunc.toString().indexOf("=>") // 2 
regFunc.toString().indexOf("=>") // -1 
+0

これは、ネストされた矢印機能を持つ非矢印機能、または矢印機能のデフォルトのパラメータ値を矢印として検出しません関数? – traktor53

+0

私は、 'indexOf'の返り値を評価することで防ぐことができる入れ子の矢印関数を検出すると思います。しかし、デフォルトのパラメータ値についてはわかりませんが、 '=>'を使わないのですか? –

+0

デフォルト値が関数であり、矢印関数としてインラインで定義されている場合のみ... – traktor53

関連する問題