Mã của bạn có một vài vấn đề.
Đầu tiên, theo định nghĩa của bạn:
var shrink = function(p) {
for (var i = 0; i < 100; i++) {
p.radius -= 1;
}
function asplode(p) {
setInterval(shrink(p),100);
balls.splice(p, 1);
}
}
asplode
là cục bộ của phạm vi bên trong shrink
và do đó không thể truy cập được mã update
nơi bạn đang cố gắng gọi nó. Phạm vi JavaScript dựa trên chức năng, vì vậy update
không thể thấy asplode
vì nó không nằm trong shrink
. ( Trong bảng điều khiển của bạn , bạn sẽ thấy một lỗi như : Uncaught ReferenceError: asplode is not defined
.)
Trước tiên, bạn có thể thử thay vì di chuyển ra asplode
ngoài shrink
:
var shrink = function(p) {
for (var i = 0; i < 100; i++) {
p.radius -= 1;
}
}
function asplode(p) {
setInterval(shrink(p),100);
balls.splice(p, 1);
}
Tuy nhiên, mã của bạn có thêm một số vấn đề nằm ngoài phạm vi của câu hỏi này:
setInterval
mong đợi một chức năng. setInterval(shrink(p), 100)
nguyên nhân setInterval
để có được giá trị trả lại của ngay lập tức được gọi shrink(p)
. Bạn có thể muốn
setInterval(function() { shrink(p) }, 100)
Mã của bạn for (var i = 0; i < 100; i++) { p.radius -= 1; }
có thể không làm những gì bạn nghĩ nó làm. Điều này sẽ ngay lập tức chạy hoạt động giảm dần 100 lần, và sau đó hiển thị trực quan kết quả. Nếu bạn muốn kết xuất lại quả bóng ở mỗi kích thước mới, bạn sẽ cần thực hiện từng lần giảm riêng lẻ trong một cuộc gọi lại thời gian riêng biệt (như một setInterval
thao tác).
.splice
mong đợi một chỉ số số, không phải là một đối tượng. Bạn có thể lấy chỉ mục số của một đối tượng với indexOf
:
balls.splice(balls.indexOf(p), 1);
Vào thời điểm khoảng thời gian của bạn chạy lần đầu tiên, balls.splice
câu lệnh đã xảy ra (chính xác là nó đã xảy ra khoảng 100ms trước đây). Tôi cho rằng đó không phải là những gì bạn muốn. Thay vào đó, bạn nên có một hàm giảm dần được gọi liên tục setInterval
và cuối cùng thực hiện balls.splice(p,1)
sau đó p.radius == 0
.
asplode
không được khai báo trong phạm vi toàn cầu (hoặc cụ thể, không được xác định trong phạm vi có thể truy cậpupdate
); kiểm tra bàn điều khiển của chúng tôi.