코드에 몇 가지 문제가 있습니다.
첫째, 당신의 정의에서 :
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
는 범위 내에서 로컬 shrink
이므로 update
호출하려는 코드에서 액세스 할 수 없습니다 . JavaScript 범위는 함수 기반이므로 내부에 없기 때문에 update
볼 수 없습니다 . ( 콘솔 에서 다음과 같은 오류가 표시 됩니다.)asplode
shrink
Uncaught ReferenceError: asplode is not defined
먼저 대신 asplode
외부로 이동해보십시오 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);
}
그러나 코드에는이 질문의 범위를 벗어난 몇 가지 문제가 더 있습니다.
setInterval
기능을 기대합니다. setInterval(shrink(p), 100)
원인 setInterval
얻가하는 반환 값 의 즉각적인 호출을 shrink(p)
. 아마 원하는
setInterval(function() { shrink(p) }, 100)
귀하의 코드 for (var i = 0; i < 100; i++) { p.radius -= 1; }
아마도 당신이 생각하는 것을하지 않을 것입니다. 감소 작업을 100 번 즉시 실행 한 다음 결과 를 시각적으로 표시합니다. 각각의 새로운 크기로 볼을 다시 렌더링하려면 별도의 타이밍 콜백 ( setInterval
작업 과 같은) 내에서 각각의 개별 감소를 수행해야합니다 .
.splice
객체가 아닌 숫자 인덱스를 예상합니다. 다음을 사용하여 객체의 숫자 색인을 얻을 수 있습니다 indexOf
.
balls.splice(balls.indexOf(p), 1);
간격이 처음 실행될 때 balls.splice
명령문이 이미 발생했습니다 (정확한 것은 약 100ms 전입니다). 나는 그것이 당신이 원하는 것이 아니라고 가정합니다. 대신,에 의해 반복적으로 호출되고 이후에 setInterval
수행 되는 감소 함수가 있어야합니다 .balls.splice(p,1)
p.radius == 0
asplode
전역 범위에서 선언되지 않았으며 (특히,에 액세스 할 수있는 범위에서 정의되지 않음update
); 콘솔을 확인하십시오.