Импликация на паметта на 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