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

How much memory does a JavaScript declared function consume on script loading?

本文关键字:多少 内存 加载 脚本 声明 函数 JavaScript      更新时间:2023-09-26

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

  • 函数声明 (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);
}

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

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

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

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

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

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