2017-02-10 17 views
-1

カレー機能コンパイラ(いくつかの男)によってキャッシュされますカレー関数はキャッシュされていますか?

以下このコンポーネントは、二つのボタンがあり、一つは、のonClickハンドラを返す関数を呼び出し、他は同じでないが、インライン。

私の知るところによれば、両方とも同じことをしており、それぞれrender()コールで新しい機能() => this.foo()を作成しています。誰かが、カレー化された関数バージョンがキャッシュされ、コンパイラによって最適化されているので、インラインバージョンと比較して利点があると述べました。私は、同じことと、これを書いた人が、その式でインライン関数を隠したかったと思う。

class MyComponent extends Component { 
    foo =() => console.log('fooo') 

    getFunction = callback => { 
    return() => callback(); 
    } 

    render() { 
    return <div> 
     <button onClick={this.getFunction(this.foo)}>curried function</button> 
     <button onClick={() => this.foo()}>inline function</button> 
    </div> 
    } 
} 

私はいくつかのグーグルをしましたが、文の証明/反証を見つけるcould't、あなたは人をどう思いますか?

+0

私は何かが足りないかもしれないが...どこカリー化はここですか?また、これはJavaScript(またはes6)ではありません。あなたは[tag:jsx]でもタグを付けることができますか? – Amadan

+0

getFunction()で? – webdeb

+0

Wikipedia: "数学とコンピュータサイエンスでは、複数の引数(または引数のタプル)を取る関数の評価を、それぞれが単一の引数を持つ一連の関数の評価に変換する技法です。あなたの 'foo'は無限の関数なので、カリングがどのように行われていると思いますか私の心を覆すことはできません。 「カレーリング」という別の意味を使っていますか? – Amadan

答えて

1

いいえ、彼らは同じことをしていません。 getFunctionは、thisコンテキストなしでコールバックを呼び出します。もちろん、特定のfooの矢印機能のためには全く問題ではありません。

はい、両方とも、すべてrenderコールで新しい機能を作成します。それぞれのクロージャのコードはキャッシュされますが、関数オブジェクトとその語彙コンテキストはキャッシュされません。これを避けるために

は、コンストラクタ内で一度だけ作成されます(任意のラッパーなし)foo機能自体を、使用します。

class MyComponent extends Component { 
    constructor(...args) { 
    super(...args); 
    this.foo = (e) => console.log('fooo'); 
    } 
    render() { 
    return <div> 
     <button onClick={this.foo}>cached function</button> 
    </div> 
    } 
} 
関連する問題