2013-07-29 30 views
5

Làm tiêu đề, tại sao việc đệ quy requestAnimationFrame sẽ không ăn RAM. Điều này post nói rằng động cơ V8 không có tối ưu hóa cho tail call, vì vậy tôi nghĩ rằng tôi phải đã bỏ lỡ một cái gì đó. Đó có phải là vì trình duyệt đã làm gì đó đằng sau nó? Hoặc V8 hỗ trợ tối ưu hóa tail call?Tại sao đệ quy "requestAnimationFrame" không ăn RAM?

Dưới đây là của example MDN:

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

requestAnimationFrame(step); 

Trả lời

9

requestAnimationFrame thông báo cho trình duyệt mà họ muốn các hàm callback được thực hiện càng sớm càng một khung cần vẽ. Việc đóng cửa chức năng phải được lưu trữ cho đến khi gọi lại được thực hiện, nhưng sau đó nó có thể được thu thập rác, cung cấp nó không được tham chiếu ở nơi khác.

Không có đệ quy nào ở đây, vì chúng tôi sẽ thực hiện qua vòng lặp sự kiện ngắt kết nối thực thi. Hàm này không gọi chính nó, nó được yêu cầu được gọi. Mỗi khi nó kết thúc thực hiện, bit đó của RAM có thể được khai hoang.

Đáng nhớ rằng nếu step chỉ đơn giản gọi là chính nó, đó sẽ là một đệ quy vô hạn. Trong trường hợp này, ngăn xếp sẽ nổ tung. Nếu chúng ta tưởng tượng một stack vô hạn mà không thể thổi lên (hoặc gọi đệ quy đuôi), nó sẽ chặn vòng lặp sự kiện và ngăn chặn bất kỳ mã nào khác chạy, vì chỉ có một hàm có thể chạy cùng một lúc.

+1

Lựa chọn tuyệt vời của từ, bạn đời! –