簡體   English   中英

JavaScript聲明的函數在加載腳本時消耗多少內存?

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

我最近(在codeschool )上過一些JavaScript課程,其中之一是,他們說:

  • 程序加載時, 函數聲明 (fd)立即建立在內存中;
  • 函數表達式 (fe)在執行期間動態建立在內存中。

因此,相對於fd,fe具有優勢,后者在加載時節省了一些內存 -我得出結論。

因此,例如,考慮下面的兩個片段代碼,加載時將不會有任何額外的內存分配,因為由於提升,會將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. 引擎開發人員決定實現功能所需的任何其他值

一切都取決於發動機的內部設計。 您可以通過在創建函數之前和之后執行堆轉儲來執行一些測試,但是實際數量會隨着添加和刪除優化而有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM