귀하의 코드는 몇 가지 문제가있다.
첫째, 당신의 정의 :
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
의 코드에 따라서 액세스 할 수 없습니다. 자바 스크립트 범위는 함수 기반이므로 update
은 shrink
안에 있지 않으므로 asplode
을 볼 수 없습니다. (In your console, 당신과 같은 오류가 나타납니다 :. Uncaught ReferenceError: asplode is not defined
를)
을 먼저 대신 shrink
의 asplode
외부 이동하려고 할 수 있습니다
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
에 의해 반복적으로 호출되고, p.radius == 0
이후에 마지막으로 balls.splice(p,1)
을 수행하는 감소 함수를 가져야합니다.
'asplode'가 전역 범위에서 선언되지 않았거나 (특히'update'에서 액세스 할 수있는 범위에 정의되지 않았습니다.); 우리의 콘솔을 확인하십시오. – apsillers
다행히도'balls.splice()'와'p'가 있습니다. – m59
오류 'Uncaught ReferenceError : asplode is not defined'가 있습니다. 함수'asplode()'가 보이지 않습니다. –