Влияние вложенных стрелочных функций на память Javascript

Рассмотреть возможность:

function f1() {
  function n11() { .. lots of code .. };
  const n12 = () => { .. lots of code .. };
  return n11()+n12()+5;
}

const f2 = () => {
  function n21() { .. lots of code .. };
  const n22 = () => { .. lots of code .. };
  return n21()+n22()+5;
}

Я пытаюсь понять последствия вызова f1 и f2 для памяти.

Что касается n11, этот ответ говорит:

На какую-то очень маленькую и обычно несущественную стоимость потраченного впустую. В наши дни движки JavaScript очень эффективны и могут выполнять множество трюков/оптимизаций. Например, только объект-функция (но не фактический код функции!) должен быть продублирован внутри. Нет проблемы расточительства без фактического тестового примера, который показывает обратное. Эта идиома (вложенных и анонимных функций) очень распространена в JavaScript и очень хорошо оптимизирована для него.

Однако я хочу знать, относится ли это также к функциям стрелок (т.е. n12, n21 и n22) ... будут ли накладные расходы только объектом функции, как указано выше, или весь код вложенной функции будет дублироваться каждый раз, когда вызывается f1/f2?

спасибо!


person kofifus    schedule 22.09.2017    source источник
comment
Вероятно, зависит от движка JavaScript. Какой из них вас интересует?   -  person Felix Kling    schedule 23.09.2017
comment
более общий вопрос, но ориентированный на современные браузеры ... известно ли, что некоторые из них лучше/хуже в этом?   -  person kofifus    schedule 23.09.2017
comment
Ну, в общем, двигатели не должны делать ничего из этого. Спецификация не требует от них этого. Однако я не понимаю, почему в этом отношении должна быть какая-то разница между стрелочными функциями и обычными функциями. Но если вы хотите точно знать, делает ли это движок или нет, вам, я думаю, придется посмотреть его исходный код.   -  person Felix Kling    schedule 23.09.2017
comment
stackoverflow.com/questions/44030645/ в этом ответе утверждается, что стрелочные функции - это просто сахар для обычных функций. Поэтому я полагаю, что они оказывают такое же влияние на память, как и обычные функции.   -  person djfdev    schedule 23.09.2017
comment
зачем вкладывать функции?   -  person Ronnie Royston    schedule 23.09.2017
comment
Рон - чтобы они могли получить доступ к окружающему закрытию   -  person kofifus    schedule 23.09.2017


Ответы (1)


Нет абсолютно никаких причин, по которым реализация должна была бы делать для стрелочных функций что-то отличное от традиционных функций в отношении совместного использования кода между различными замыканиями одной и той же функции. Единственная разница между стрелочными функциями и традиционными функциями заключается в том, что стрелочные функции сохраняют значение this. Это можно сделать с помощью того же механизма, который уже предусмотрен для метода Function.prototype.bind(). Стрелочная функция — это в основном просто синтаксический сахар.

func = () => { body };

примерно эквивалентно:

func = function() { body }.bind(this);

(Это небольшое упрощение, поскольку стрелочные функции также не получают объект arguments, но это не должно влиять на то, что вы спрашиваете.)

person Barmar    schedule 22.09.2017
comment
спасибо! есть ли у вас информация о том, что вложенные функции (стрелочные или обычные) на самом деле оптимизированы? - person kofifus; 23.09.2017
comment
Во вложенных функциях нет ничего, что потребовало бы от них дублирования кода. Все, что связано с областями действия переменных, обрабатывается в данных закрытия функции, а не в коде. - person Barmar; 23.09.2017