Лямбда-функция возвращает функцию с другим расположением памяти? - PullRequest
0 голосов
/ 24 апреля 2019

Итак, вот код, с которым я пытаюсь работать

const someFunc = (a) => (b) => a + b;
const someArray = [1, 2];
const firstOrder = someArray.map(a => someFunc(a));

firstOrder[0] === firstOrder[1]; // returns false 

Я не уверен, почему это функция с другим расположением памяти.

Я ожидал выполнить аналогичную функцию, в которой

firstOrder[0] === firstOrder[1]; // should return true

Я не уверен, возможно ли что-то подобное.

Основная мотивация здесь состоит в том, чтобы избежать использования памяти.

Полагаю, я мог бы здесь помочь.

Заранее спасибо.

1 Ответ

2 голосов
/ 24 апреля 2019

Как сказано в комментарии, функции с разными областями действия никогда не будут === друг другу.

Переполнение памяти простой функции почти ничего не стоит, особенно на современном оборудовании и современных движках JS, поэтомупрежде чем тратить на это усилия, убедитесь, что это не случай преждевременной оптимизации - запустите тест производительности и убедитесь, что это действительно узкое место в первую очередь.

В настоящее время вы проходитемассив функций, предположительно, чтобы их можно было перебирать и вызывать позже.Подумайте о том, чтобы передать просто someArray и someFunc, который принимает 2 аргумента и возвращает вместо него число;массив примитивов занимает меньше памяти, чем массив функций.Например, следующий код занимает для меня ~ 1400M памяти в Chrome:

const someFunc = (a) => (b) => a + b;
const arrayOfFunctions = Array.from({ length: 1e7 }, (_, i) => someFunc(i));
// eventually use arrayOfFunctions

Но если вы просто сохраните свой someArray и вызываете функцию только тогда, когда вам нужен доступ к окончательному число возвращается, объем памяти намного меньше:

const someFunc = (a, b) => a + b;
const someArray = Array.from({ length: 1e7 }, (_, i) => i);
// eventually, once you need access to the final numbers, iterate through someArray and call someFunc with it:
// ...
const theBArgument = 5;
const result = someArray.map(a => someFunc(a, theBArgument));

До result для меня в Chrome используется только ~ 120M памяти.

...