2016-05-16 42 views
1

所有的觀點:如何關閉和構造工作從JS引擎

我非常新的JS,任何人都可以給我一個小細節JS引擎如何創建封閉,它是如何運行的構造函數?或許從這個角度分配的內存(數據結構棧一樣),以及如何引用如何分配

感謝

+0

可能的[在編譯器中實現閉包]的副本(http://stackoverflow.com/questions/18051012/implementing-closures-in-a-compiler) –

回答

1

我不知道引擎常見的JS如何做到這一點的,可是作爲遵循的一般過程:

  • 變量屬於一個框架。一個框架捕捉它的外框。
  • 閉包捕獲它所屬的框架。
  • 它直接捕獲一個框架而不是變量,因此它可以更改外框中變量的值,並且更改將在外框中可見。最小示例

    var x = 1; 
    (function() { x = 2 })(); // <- a closure that gets invoked directly. 
    console.log(x); // x == 2 
    
  • 閉包(也稱爲函數對象)是普通變量,並且適用普通垃圾收集。 (這實在遠非微不足道,因爲函數「知道自己」,c.f. "letrec"。)

  • 實際上,在JS,c.f.中賦值給變量的函數和閉包之間沒有區別。 "hoisting"

所以,如果你想實現一個JavaScript引擎,框架將只是在C結構:

var a, b, c; 

- >

struct frame_42_t { 
    void *parent_frame; 
    object *a, *b, *c; 
}; 

當然,實際的發動機做很多優化,例如終身扣除一個變量。一個臨時變量不會被保存在一個幀如果發動機可以扣除,這將不會再次閱讀:

var temp = a; 
a = b; 
c = temp; 

閉包是那麼只是另一種結構:

struct function_4711_t { 
    void *parent_frame; 
    result_type (*call)(void *frame); 
}; 

... 

function_4711->call(function_4711->parent_frame); 

另一個明顯優化引擎試圖推導變量的類型,但我想這只是當你只想瞭解基礎知識而已。