2017-02-10 2 views
-1

функции получает карри кэшируются компилятором (какой-то парень)Curried Функции кэшируются?

Этот компонент ниже имеет две кнопки, одна вызывает функцию, которая возвращает обработчик OnClick, другой делает то же самое, но встроенный.

По моим сведениям, обе делают то же самое, они создают новую функцию () => this.foo() на каждом вызове render(). Кто-то сказал, что версия функции в карманах кэшируется и оптимизируется компилятором, поэтому есть преимущество по сравнению с встроенной версией. Я думаю, что это то же самое, и тот, кто написал это, хотел скрыть встроенную функцию с этим выражением.

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

Из Википедии: «В математике и информатике каррирование - это метод перевода оценки функции, которая принимает несколько аргументов (или кортеж аргументов) в оценку последовательности функций, каждая из которых имеет один аргумент». Ваша 'foo' - это функция с нулевым значением, поэтому я не могу обдумать, как вы думаете, что происходит каррирование. Вы используете какой-то альтернативный смысл «currying»? – 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> 
    } 
} 
Смежные вопросы