JavaScript声明函数在脚本加载时消耗了多少内存?

时间:2016-01-22 19:30:06

标签: javascript memory memory-management

我最近参加了一些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);
}

所以问题是:我的推理是对的吗?如果是这样,加载时需要多少内存以及如何计算?

1 个答案:

答案 0 :(得分:3)

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

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

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

  1. 该功能的可执行代码
  2. 参数名称的绑定
  3. 关闭值
  4. 代码的字符串值(如果引擎支持它)
  5. 引擎开发人员已决定实现功能所需的任何其他值
  6. 全部取决于发动机的内部设计。您可以通过在创建函数之前和之后执行堆转储来执行某些测试,但实际数字会随着优化的添加和删除而变化。