2017-02-10 55 views
-1

咖喱功能得到由编译器(某些人Curried函数被缓存?

下面这个组件有两个按钮,一个调用它返回的onClick处理程序的功能,而另一个则是相同的,但是内联缓存。

据我所知,两者都在做同样的事情,他们在每个render()调用上创建一个新功能() => this.foo()。有人说curried函数版本被编译器缓存和优化,所以与内联版本相比有一个好处。我认为它完全一样,写这个的人想要用这个表达式隐藏一个内联函数。

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> 
    } 
} 

我做了一些Google搜索,但没有找到一个声明的证明/ disproof,你认为什么人?

+0

我可能失去了一些东西,但是......这里这里的钻营?另外,这不是JavaScript(也不是es6) - 你可能想用[tag:jsx]来标记吗? – Amadan

+0

在getFunction()? – webdeb

+0

维基百科:“在数学和计算机科学中,柯里格是一种将函数的​​评估转化为函数的技术,该函数将多个参数(或一个参数元组)用于评估一系列函数,每个函数都有一个参数”。你的'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> 
    } 
}