【问题标题】:How much memory does a JavaScript declared function consume on script loading?JavaScript 声明的函数在脚本加载时消耗多少内存?
【发布时间】:2016-01-22 19:30:05
【问题描述】:

我最近参加了一些 JavaScript 课程(codeschool),在其中一门课程中,他们说:

  • 函数声明 (fd) 在程序加载时立即在内存中构建;
  • 函数表达式 (fe) 在执行期间动态构建在内存中。

因此 fe 比 fd 有一个优势,即 在加载时节省一些内存 - 我总结道。

因此,例如,考虑以下两个截断的代码,在加载时不会有任何额外的内存分配,因为由于提升,foo 将被分配给undefined

// Original code
var foo = function (bar) {
  console.log(bar);
};

下面是提升后的代码

// Code after hoisting
var foo = undefined;

foo = function (bar) {
  console.log(bar);
};

简而言之,fooundefined,并且函数表达式只会在代码运行后分配给foo。因此它不会在加载时分配额外的内存。

好的。到现在都没有问题。但是,“如果 fe 比 fd 有一个优势,即 在加载时节省一些内存”下面的代码应该在加载时分配一些额外的内存,因为它是一个函数声明。

function foo(bar) {
  console.log(bar);
}

所以问题是:我的推理是否正确?如果有,加载时需要多少内存,如何计算?

【问题讨论】:

    标签: javascript memory memory-management


    【解决方案1】:

    是的,你是对的,因为所有函数声明都被提升到顶部并且(通常)在现场编译。函数表达式通常直到运行时才编译,因为它们可能会或根本不会被使用:

    var f;
    if (condition) {
      f = function() { ... };
    }
    // f could be undefined
    

    至于需要多少内存,这取决于引擎的实现。他们如何存储:

    1. 函数的可执行代码
    2. 参数名称的绑定
    3. 闭合值
    4. 代码的字符串值(如果引擎支持)
    5. 引擎开发人员决定实现功能所需的任意数量的其他值

    一切都取决于引擎的内部设计。您可以通过在创建函数之前和之后执行堆转储来执行一些测试,但实际数量会随着优化的添加和删除而变化。

    【讨论】:

    • Answer this " 如果是,加载时需要多少内存,如何计算?"大声笑
    • @AdamBuchananSmith 就像我说的,这取决于引擎。 “计算”是根据数据字段的数量和大小完成的,以表示引擎中的功能。我还提到您可以通过在声明函数之前和之后获取堆快照来进行自己的计算。
    • 好吧,我什至没有把你的答案看完,我以为你没有机会回答它......仍然没有lol
    • @AdamBuchananSmith 我不明白。我已经尽可能地回答了这个问题。 “这取决于”不是一个非常令人满意的答案,但它是任何人都可以给出的唯一诚实的答案,而无需对每个可能的浏览器进行广泛的测试,然后可能会得出一些中等大小或其他东西。
    • 我要给你投票。我只是有点讽刺地说。因为没有真正的答案。您的回答确实很好地回答了他的其余问题。不过。
    猜你喜欢
    • 2018-11-07
    • 2012-09-12
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多