1
所有的觀點:如何關閉和構造工作從JS引擎
我非常新的JS,任何人都可以給我一個小細節JS引擎如何創建封閉,它是如何運行的構造函數?或許從這個角度分配的內存(數據結構棧一樣),以及如何引用如何分配
感謝
所有的觀點:如何關閉和構造工作從JS引擎
我非常新的JS,任何人都可以給我一個小細節JS引擎如何創建封閉,它是如何運行的構造函數?或許從這個角度分配的內存(數據結構棧一樣),以及如何引用如何分配
感謝
我不知道引擎常見的JS如何做到這一點的,可是作爲遵循的一般過程:
它直接捕獲一個框架而不是變量,因此它可以更改外框中變量的值,並且更改將在外框中可見。最小示例
var x = 1;
(function() { x = 2 })(); // <- a closure that gets invoked directly.
console.log(x); // x == 2
閉包(也稱爲函數對象)是普通變量,並且適用普通垃圾收集。 (這實在遠非微不足道,因爲函數「知道自己」,c.f. "letrec"。)
所以,如果你想實現一個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);
另一個明顯優化引擎試圖推導變量的類型,但我想這只是當你只想瞭解基礎知識而已。
可能的[在編譯器中實現閉包]的副本(http://stackoverflow.com/questions/18051012/implementing-closures-in-a-compiler) –