2013-07-29 40 views
5

作爲標題,爲什麼​​遞歸不會吃掉RAM。這post表示,V8引擎沒有優化tail call,所以我想我一定錯過了一些東西。那是因爲瀏覽器做了什麼嗎?或者V8支持優化tail call爲什麼「requestAnimationFrame」遞歸不會吃掉RAM?

這裏的MDN的example

function step(timestamp) { 
    var progress = timestamp - start; 
    d.style.left = Math.min(progress/10, 200) + "px"; 
    if (progress < 2000) { 
    requestAnimationFrame(step); 
    } 
} 

requestAnimationFrame(step); 

回答

9

​​通知它想盡快一幀需要繪製執行的回調函數瀏覽器。函數的關閉必須存儲直到回調完成,但在此之後可以進行垃圾回收,只要其他地方沒有引用。

這裏沒有遞歸,因爲我們正在通過一個斷開執行的事件循環。該函數不會自行調用,而是要求調用。每次完成執行時,該位RAM都可以被回收。

值得記住的是,如果step只是自己調用,那將是一個無限遞歸。在這種情況下,堆棧會炸燬。如果我們想象一個無法堆棧的擴展(或者尾部遞歸),它會阻塞事件循環並阻止任何其他代碼運行,因爲只有一個函數可以一次運行。

+1

單詞的最佳選擇,隊友! –

相關問題