2017-03-23 8 views
2

bindとReactコンポーネントでの匿名関数の使用のパフォーマンスに違いがあるかどうかを知りたいと思います。React performance:bindと匿名関数の比較

具体的には、次のいずれかのパフォーマンスが他のパフォーマンスより優れていますか?

const MyComponent = ({ myHandler }) => { 
    ... 
    return (
    <a onClick={myHandler.bind(this, foo, bar)} ...> 
     hello world 
    </a> 
); 
} 

const MyComponent = ({ myHandler }) => { 
    ... 
    return (
    <a 
     onClick={() => { 
     myHandler(this, foo, bar) 
     } 
     ... 
    > 
     hello world 
    </a> 
); 
} 

が重複する可能性の質問への答えは、メモリフットプリントに焦点を当てているため、この問題は、重複する可能性は異なっています。

+0

[Lambda関数とバインド、メモリの重複が考えられます。 (そしてパフォーマンス)](http://stackoverflow.com/questions/42117911/lambda-functions-vs-bind-memory-and-performance) –

+0

イベントを処理するための無名関数を作成する必要がある場合は、現在のコンポーネントの一部を新しいコンポーネントに抽出する必要があることを通知します。すべてのハンドラパラメータを新しいコンポーネントの小道具にする。 – zerkms

答えて

4

まず第一に、あなたはあなたの質問を設定する方法が少しerraneousです:

あなたの最初の例<a onClick={myHandler.bind(this, foo, bar)} ...>は、それぞれそれがコンポーネントのコンテキストにバインドし、常にfoobarなどがありますされてレンダリングに新しい関数を作成します最初の2つの引数。

あなたの第二の例<a onClick={() => myHandler(this, foo, bar)} ...>ではなく、これはコンポーネントコンテキストを表しmyHandler 3と引数、thisfoobarを呼び出します。

理論的なレベルでは、2つの概念について議論しています。新しい匿名バインド関数を作成してその関数を呼び出すよりも高価な関数にバインドするのは、thisですか?私は両方のアプローチがパフォーマンスの観点から非常に似ていると言います:両方の場合に新しい関数(func.bind docs)を作成しています。

パフォーマンスの差が小さいため、パフォーマンスが重視されるこのようなソフトウェアは開発されません。() => {}bindのいずれかを選択すると問題が発生します。

ここでパフォーマンスを向上させる場合は、classを使用し、クリックハンドラをconstructorのコンテキストにバインドすることを選択します。そうすれば、レンダリングするたびに新しい関数を作成する必要はありません。

希望します。

2

違いがある場合、その差は非常に小さく、測定可能な場所でテストを行うことができれば非常に驚くことでしょう。あなたと同じコードベースの他の人が理解しやすいバージョンで行ってください。

+1

@zerkms回答が少なく投機的に更新されました。 –