【问题标题】:Lambda function return a function with different memory location?Lambda函数返回具有不同内存位置的函数?
【发布时间】:2019-09-13 10:31:39
【问题描述】:

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

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

我不确定这样的事情是否可行。

这里的主要动机是避免内存占用。

我想我可以在这里使用一些帮助。

提前致谢。

【问题讨论】:

  • 不同作用域的函数之间永远不会===。不过,这听起来有点像过早的优化,除非您正在运行性能测试并确定这确实是一个瓶颈......?如果必须,我会保存对someArray 的引用,并使用它和返回数字而不是函数的someFunc,而不是使用.map,这样你就只有one 基元数组和 一个 函数在内存中,
  • someFunc(1)someFunc(2) 是非常不同的函数,不是吗?当使用相同的输入调用它们时,它们甚至不会返回相同的结果:someFunc(1)(3) != someFunc(2)(3)
  • @CertainPerformance 不确定我是否明白,如果你能写一些代码会很有帮助。

标签: javascript lambda functional-programming closures


【解决方案1】:

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

一个简单函数的内存开销几乎没有,尤其是在现代硬件和现代 JS 引擎上,所以在花费精力之前,请确保这不是 premature optimization 的情况 - 运行性能测试,并确保首先确定这实际上是一个瓶颈。

您当前正在传递一组函数,大概是为了以后可以迭代它们并被某些东西调用。考虑传递 just someArraysomeFunc,它接受 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 上只使用了 ~120M 内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多