2013-06-13 39 views
5

Tôi không chắc chắn làm thế nào để đặt câu hỏi rattling xung quanh trong đầu của tôi ngay bây giờ, vì vậy chịu với tôi. Tôi là thương hiệu mới cho lập trình không đồng bộ, và tôi đã tìm ra cách tốt nhất để học sẽ là tạo một trò chơi pong nhỏ. Tôi bắt đầu với một shootball() chức năng và chỉ trả lại một div xung quanh div khác. Làm thế nào tôi đã làm điều này là với một cái gì đó như thế này:Không đồng bộ Javascript đệ quy

function shootball(angle, speed){ 
    angle = (angle/360.0)*2*Math.PI; 
    var ballmotion = setInterval(function(){ 
     var nowx, nowy, minusY, plusX; 
     nowx = $("#ball").position().left; 
     nowy = $("#ball").position().top; 
     minusY = Math.sin(angle) * 4.0; 
     plusX = Math.cos(angle) * 4.0; 
     if(hitsWall(nowx+plusX, nowy-minusY)){ 
      clearInterval(ballMotion); 
      shootball(newAngle(nowx+plusX, nowy-minusY), speed); 
     } 
     $("#ball").css("left", (nowx + plusX)).css("top", (nowy - minusY)); 
    }, 10/speed); 
} 

Tôi không phải là một fan hâm mộ lớn của đệ quy không cần thiết lớn, nhưng tôi chỉ muốn thử nó ra. Lo và nhìn nó hoạt động chính xác như tôi mong đợi. Nhưng khi tôi bắt đầu ăn phần còn lại của chương trình, tôi đã không thể tránh được bản chất đệ quy này. Vì vậy, câu hỏi của tôi: Liệu javascript bằng cách nào đó nhận ra rằng các chức năng gọi "shootball" về cơ bản là hoàn thành sau khi gọi clearInterval? Hoặc thực hiện điều này thực sự tìm thấy chính nó tải lên ngăn xếp của tôi với hồ sơ kích hoạt không cần thiết? Cảm ơn trước cho bất kỳ chuyên môn này có thể trống lên.

+2

Bạn có thể đặt điểm ngắt và xem mã gọi;) –

+1

Nếu một hàm mất nhiều thời gian để gọi hơn khoảng thời gian, _setInterval_ có thể khó chịu, hãy cân nhắc sử dụng _setTimeout_ để thay thế. Ngoài ra, tôi chắc chắn rằng bạn có thể di chuyển phần lớn các chức năng bên ngoài biểu thức để một cá thể chức năng mới không được tạo ra mỗi lần. –

+0

Tôi không hoàn toàn chắc chắn nhưng tôi tin rằng bất cứ khi nào quả bóng không chạm vào tường, ngăn xếp sẽ bị làm trống. – aledujke

Trả lời

4

Có phải javascript nào đó nhận ra rằng chức năng gọi "bắn súng" về cơ bản đã hoàn thành sau khi gọi clearInterval chưa?

Không, shootball được hoàn thành từ lâu, ngay sau khi được giao cho ballmotion. Tuy nhiên, phạm vi biến của nó (angle, speed, ballmotion và phạm vi gốc) đã tồn tại kể từ khi hàm ẩn danh xây dựng một đóng với nó và được tham chiếu từ bên ngoài (từ trình lên lịch). Và phạm vi đó sẽ bị thu gom rác sau khi cuộc gọi clearInterval loại bỏ các tham chiếu đến nó.

điều này thực sự tìm thấy chính nó tải lên ngăn xếp của tôi với hồ sơ kích hoạt không cần thiết?

Không. Mọi chức năng được thực hiện qua setTimeout/setInterval chạy trong ngữ cảnh thực thi riêng, với ngăn xếp cuộc gọi hoàn toàn mới.

+0

Các biến có thể không nhất thiết bị xóa vì trong một số trình duyệt, chúng sẽ giữ tất cả các biến còn sống miễn là trang đang chạy. –

+0

@Derek: Bạn có nghĩa là một số trình duyệt nén bộ sưu tập rác của 'clearInterval'? – Bergi

+0

Tôi không chắc chắn nhưng vì tôi không nghĩ rằng nó được viết trong các tiêu chuẩn nên trình duyệt không nhất thiết phải xóa các biến vô ích. –

Các vấn đề liên quan