当前位置: 首页 > 知识库问答 >
问题:

箭头函数和内存泄漏[重复]

殳俊晤
2023-03-14
someHugeArray.forEach(record => {
  const someValues = [...getAnotherHugeArray()]
  const sum = _.sumBy(someValues, 'total')

  record.getPrice = () => sum / record.quantity
})
someValues = null

或者javascript引擎足够聪明,不会在内存中保存函数的词法环境的值,而它不使用这个环境?

共有1个答案

欧阳洲
2023-03-14

DR

  • 根据ECMAScript,完整的词汇环境是绑定的
  • 在实践中,如果可能的话,引擎会通过只绑定使用的变量来优化这一点
  • 优化是不可能的,例如,当eval()
  • 内部使用

我发现了一个很好的文章系列,其中对此进行了深入讨论:

    null

验证:在浏览器控制台中执行以下操作:

(() => {
    //eval(); // <- uncomment this line for second test
    const thisIsUsed = 1;
    const isThisBound = 2;
    return () => {
        debugger;
        return ('result: ' + thisIsUsed);
    }
})()();

当调试器启动时,查看“范围”(Chrome)。您还可以将thisisusedisthisbound添加到“监视”列表中。

下面是使用Chrome(金丝雀,版本85.0.4154.0)的截图:

 类似资料:
  • 我担心从泄漏金丝雀回来的信息。它显示了在UI上声明的所有变量,如片段中的材料按钮、材料卡片视图、文本视图、图像视图等,都导致了内存泄漏。我不知道为什么会这样。

  • 问题内容: 我根据教程实现了加密过程: http://www.openssl.org/docs/crypto/EVP_EncryptInit.html# 当我运行它通过低谷并得到以下报告: 我下载了OpenSSL的源代码。在ERR_put_error内部,我看到了ERR_get_state中的内存分配,并在err_clear_data内部释放了内存,但是累积了err_clear_data内部的逻辑

  • TL;dr:如何在没有随机文本的情况下将无符号32位整数转换为chars/uint8_t 好的,我愿意为此牺牲几个声誉点。我需要快速将一个4字节的无符号整数转换为数组字节,以便读取/写入/操作我自己结构的二进制文件。 这样我就可以读取一个结构,然后将其用作对象,而不是读取它,为每个更改写入它。 但是当我尝试实现一个函数时,我得到了一个泄漏。指针只是不断在函数范围之外添加值。 主要: 和输出: 在我

  • 问题内容: 我的socket.io版本是socket.io@0.8.7和redis@0.7.1。我在Windows上。 在某些地方,我已经看到问题已解决。我想我正在使用最新的socket.io版本。什么是generator.setMaxListeners(),在哪里可以设置? 我正在使用redis pubsub,当我订阅redis时,它会抛出此警告。 问题答案: 有一个与此相关的已知问题。好像是几

  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 问题内容: 我一直在追寻内存泄漏(由“ valgrind –leak-check = yes”报告),它似乎来自ALSA。这段代码已经存在于自由世界中一段时间​​了,所以我猜这是我做错的事情。 输出看起来像这样: 并继续一些页面 这是由于我在一个项目中使用ALSA并开始看到这种巨大的泄漏……或者至少是所说泄漏的报告。 所以问题是:是我,ALSA或valgrind在这里遇到问题吗? 问题答案: ht