2015-10-08 31 views
1

一個函數可以在PhantomJS JavaScript引擎的調用堆棧限制之前遞歸調用自己多少次?換句話說,什麼是最後可能n這裏印刷的PhantomJS:在PhantomJS中,函數調用堆棧限制是什麼?

var n = 0; 
function f() { 
    console.log(++n); 
    f(); 
} 
f(); 
+0

下面是我得到的:'43540 - RangeError:超過最大調用堆棧大小'。在發佈正式答案之前,我會等待其他評論。 –

回答

3

我用你的代碼,並在我的電腦和我的樹莓派1運行Raspbian不同PhantomJS版本上運行它。

 
Platform | Version | Maximum callstack 
-------------------------------------- 
Win 8.1 | 2.0.0 | 65277 
Win 8.1 | 1.9.8 | 65534 
Win 8.1 | 1.9.7 | 65534 
Win 8.1 | 1.9.0 | 65534 
Win 8.1 | 1.8.2 | 65534 
RPi 1 | 2.0.1* | 43547 
RPi 1 | 1.9.7 | 65534 
RPi 1 | 1.9.0 | 65534 

*上編譯03月13日2015年發展版本樹莓派2

下面是一個更現實的代碼示例,因爲你很少在PhantomJS腳本或在使用同步和遞歸碼頁。

var n = 0; 
function f() { 
    console.log(++n); 
    //f(); 
    setTimeout(f, 0); 
} 
f(); 

此異步版本,這是更可能被使用,沒有明顯的調用堆棧的限制。在大約300,000次迭代(52分鐘)之後,我停止了這個過程(Win 8.1上的v1.9.8和v2.0.0)。版本1.9.8一直佔用27.2 MB的內存,v2.0.0在8到10 MB的內存範圍內跳躍。

+0

413525爲PhantomJS 2.0.0和它繼續... –

+0

它現在是768440在8.8 MB。我現在要停下來。 –

+0

這很有趣。我想這只是意味着超時關閉的執行上下文不依賴於調用代碼。 IE,沒有調用堆棧。 –