Kodunuzda birkaç sorun var.
İlk olarak, tanımınızda:
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
içindeki kapsam için yereldir shrink
ve bu nedenle update
onu aramaya çalıştığınız kod tarafından erişilemez . JavaScript kapsamı işlev tabanlıdır, bu nedenle içeride update
olmadığı için göremezsiniz . ( Konsolunuzda aşağıdaki gibi bir hata görürsünüz .)asplode
shrink
Uncaught ReferenceError: asplode is not defined
İlk olarak aşağıdakilerin asplode
dışına çıkmayı deneyebilirsiniz 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);
}
Ancak, kodunuzun bu sorunun kapsamı dışında kalan birkaç sorunu daha vardır:
setInterval
bir işlev bekliyor. setInterval(shrink(p), 100)
neden setInterval
almak için dönüş değeri arasında -derhal çağrılan shrink(p)
. Muhtemelen istiyorsun
setInterval(function() { shrink(p) }, 100)
Kodunuz for (var i = 0; i < 100; i++) { p.radius -= 1; }
muhtemelen düşündüğünü yapmaz. Bu işlem hemen azaltma işlemini 100 kez çalıştırır ve ardından sonucu görsel olarak gösterir. Topu her yeni boyutta yeniden işlemek istiyorsanız, her bir ayrı düşüşü ayrı bir zamanlama geri araması (bir setInterval
işlem gibi ) içinde yapmanız gerekir .
.splice
bir nesne değil, sayısal bir dizin bekliyor. Aşağıdakilerle bir nesnenin sayısal dizinini alabilirsiniz indexOf
:
balls.splice(balls.indexOf(p), 1);
Aralığınız ilk kez çalıştığında, balls.splice
ifade zaten gerçekleşti (tam olarak 100ms önce oldu). Sanırım istediğin bu değil. Bunun yerine, sürekli tarafından çağrılır bir eksiltim fonksiyonu olmalıdır setInterval
ve son olarak gerçekleştirir balls.splice(p,1)
sonra p.radius == 0
.
asplode
küresel kapsamda beyan edilmemiş (veya özellikle erişilebilecek bir kapsamda tanımlanmamıştırupdate
); konsolumuzu kontrol edin.