2017-10-24 12 views
2

可能であれば、名前付き矢印関数を返す最も簡単な方法は何ですか? 1上記の例でわかるようes6は動的に名前付きの矢印関数を返します

const add = a => b => b + a 
const add5 => add(5) 

add.name == 'add' // true 
add5.name == '' // true, but I would like it to be 'add5' 

ので、返された矢印機能は匿名であり、私はそれが(「親」機能と「パラメータ」aに基づいて理想的には)という名前にしたいと思います - これはデバッグには便利です。

+2

。 – Brandon

+1

良い質問です。 AFAIKでは簡潔な矢印の構文を失うことなく簡単な方法があります。このため、私は現在、開発段階でプラグインできる実行時型システムを構築しています。これはES6の 'Proxy'sに基づいており、そのプロパティの1つは、無名の矢印関数のシーケンスに名前を付ける可能性です。ですから、プロキシを使ってやります。 – ftor

+1

関数の引数に関数の引数を組み込むには、 'eval'を使う必要があります。これがそれに値すると確信していますか? – Thomas

答えて

3

あなたはこれを行うことができます。

const add = a => (({[`add${a}`]: b => b + a})[`add${a}`]); 
 
const add5 = add(5); 
 

 
console.log(add5.name);
どのように動作する

:ローカルオブジェクトを定義し、ご希望の名前を持つメンバーとして矢印方法を割り当てます。

const add = a => { 
    const o = { 
    [`add${a}`]: b => b + a 
    }; 
    return o[`add${a}`]; 
}; 
+3

私はOPが変数のような名前の関数を望んでいて、渡された数値(*しかしそれはちょうど私が理解した*)によるものではないと信じています。 –

+0

@Brandon 'add add'の* add *にリンクされた' add $ {a} 'に* add *をハードワイヤリングしないときはありますか? –

+0

私が知っているわけではありません – Brandon

0

これはまったく同じではありませんが、

const add = a => b => a + b; 
 
const add5 = (...a) => add(5)(...a); 
 

 
console.log(add5(100)); // => 105 
 
console.log(add5.name); // => 'add5'
div{min-height:100%}

0

この例では、矢印の関数名が割り当てられている方法を示し、この動作を変更することはできません。矢印機能nameは、割り当てられた変数またはオブジェクトプロパティの名前と同じです。

nameは非書き込み可能なプロパティですが、常緑のブラウザを含めてほとんどの実装で設定可能なので、デバッグ目的のために使用しても安全です:

function namedArrow(name, fn) { 
    Object.defineProperty(fn, 'name', { enumerable: false, value: name }); 
    return fn; 
} 

const foo = namedArrow('foo!',() => { throw new Error }); 
foo(); 

それは出力:

[foo]

デバッグの目的で、同じ役割を果たすと思われるdisplayNameも使用でき、一部のデバッガやブラウザデバッガツール、特にFirefoxとChromeでサポートされています:

function namedArrow(name, fn) { 
    fn.displayName = name; 
    return fn; 
} 

それは同じような出力になり、まだそれはErrorコールスタックとうまく再生されない:あなたのADD5ラインは有効な構文ではありません

foo

関連する問題