Lambda函数返回具有不同存储位置的函数?

时间:2019-04-24 07:41:32

标签: javascript lambda functional-programming closures

所以这是我正在尝试使用的一些代码

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 个答案:

答案 0 :(得分:2)

如评论中所述,具有不同作用域的函数永远不会相互===

简单函数的内存开销几乎为零,尤其是在现代硬件和现代JS引擎上,因此,在为此付出努力之前,请确保这不是premature optimization的情况-运行性能测试,并确保这首先是瓶颈。

您当前正在传递一组函数,大概是为了让它们可以迭代并稍后由某些函数调用。考虑绕过{em> just someArray和一个someFunc,它们接受2个参数并返回一个数字;基本数组比函数数组占用更少的内存。例如,以下代码为我占用了Chrome上约1,400M的内存:

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上的约1.2亿内存。