Curried 函数被缓存?
Curried Functions are cached?
Curried functions gets cached by the compiler (some guy)
下面的这个组件有两个按钮,一个调用 returns onClick 处理程序的函数,另一个执行相同的操作,但内联。
据我所知,两者都在做同样的事情,它们在每次 render()
调用时创建一个新函数 () => this.foo()
。有人说 curried function 版本被编译器缓存和优化,所以相对于 inline 版本有好处。我认为这是完全相同的事情,写这篇文章的人想用那个表达式隐藏一个内联函数。
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>
}
}
我进行了一些谷歌搜索,但找不到 proof/disproof 声明,你们觉得伙计们怎么样?
不,他们不是在做同样的事情; 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>
}
}
Curried functions gets cached by the compiler (some guy)
下面的这个组件有两个按钮,一个调用 returns onClick 处理程序的函数,另一个执行相同的操作,但内联。
据我所知,两者都在做同样的事情,它们在每次 render()
调用时创建一个新函数 () => this.foo()
。有人说 curried function 版本被编译器缓存和优化,所以相对于 inline 版本有好处。我认为这是完全相同的事情,写这篇文章的人想用那个表达式隐藏一个内联函数。
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>
}
}
我进行了一些谷歌搜索,但找不到 proof/disproof 声明,你们觉得伙计们怎么样?
不,他们不是在做同样的事情; 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>
}
}