我找到了一個V8發(fā)行報告這正是你想要的。
現(xiàn)在,總結(jié)一下那份報告中所說的話.V8可以存儲堆棧中函數(shù)的本地變量。或在堆上的“上下文”對象中。它將在堆棧上分配局部變量,只要函數(shù)不包含引用它們的任何內(nèi)部函數(shù)。這是一個優(yōu)化..如果任何內(nèi)部函數(shù)是指局部變量,這個變量將放在上下文對象中(即堆上而不是堆棧上)。案例eval
是特殊的:如果它是由一個內(nèi)部函數(shù)調(diào)用的,全局部變量放在上下文對象中。
上下文對象的原因是,通常您可以從外部函數(shù)返回內(nèi)部函數(shù),然后外部函數(shù)運行時存在的堆棧將不再可用。因此,內(nèi)部函數(shù)訪問的任何東西都必須生存于外部函數(shù)中,并且生活在堆上而不是堆棧上。
調(diào)試器無法檢查堆棧上的那些變量。關(guān)于調(diào)試中遇到的問題,有一個項目成員說:
我能想到的唯一解決方案是,每當(dāng)DevTools打開時,我們就會取消所有代碼,并使用強制上下文分配重新編譯。不過,在啟用DevTools的情況下,這將顯著地降低性能。
下面是“如果任何內(nèi)部函數(shù)引用變量,將其放入上下文對象”的示例。如果你運行這個,你就可以訪問x
在debugger
聲明,盡管x
僅在foo
職能,從未被稱為!
function baz() {
var x = "x value";
var z = "z value";
function foo () {
console.log(x);
}
function bar() {
debugger;
};
bar();}baz();