2013-07-29 18 views
5

. Bu post V8 motor tail call için hiçbir optimizasyonu var, bu yüzden ben bir şey kaçırmış olmalı düşünüyorum söyledi. Bunun nedeni tarayıcı, arkasında bir şey yaptı mı? Veya V8 tail call'un optimizasyonunu destekliyor mu?Neden "requestAnimationFrame" tekrarlaması RAM'i yemiyor? <code>requestAnimationFrame</code> yineleme RAM yiyip olmaz neden başlık olarak

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

requestAnimationFrame(step); 

cevap

9

requestAnimationFrame o geri çağırma işlevi en kısa sürede bir çerçeve çizerek ihtiyacı olarak yürütülecek istediği tarayıcıyı bildirir:

İşte MDN en example var. Fonksiyonun kapatılması, geri arama yapılıncaya kadar saklanmalıdır, ancak bundan sonra başka yerde referans verilmemesi kaydıyla, çöp toplanabilir. Biz yürütme keser bir olay döngüsü yoluyla gidiyoruz olarak

, burada Yinelemesiz yoktur. Fonksiyon kendisini çağırmıyor, çağrılmayı istiyor. Her çalışma bittiğinde, bu RAM biraz geri kazanılabilir. step basitçe kendisini denilen ise, bu sonsuz özyineleme olacağını hatırlayarak değer

. Bu durumda, yığın havaya uçurdu. Patlayamayan sonsuz bir yığın (veya yineleme çağrısı) hayal edersek, olay döngüsünü engeller ve başka bir kodun çalışmasını engeller, çünkü sadece bir işlev aynı anda çalışabilir. Kelimelerin

+1

Mükemmel seçim, dostum! –

İlgili konular