http://jsfiddle.net/goldrunt/jGL84/42/ pochodzi z linii 84 w tym skrzypce JS. Istnieją 3 różne efekty, które można zastosować do kulek poprzez odkomentowanie linii 141-146. Efekt „odbicia” działa tak, jak powinien, ale efekt „asplode” nic nie robi. Czy powinienem zawrzeć funkcję „zmniejszania” w funkcji asplode?
// balls shrink and disappear if they touch
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);
}
}
javascript
html
MattO
źródło
źródło
asplode
nie jest zadeklarowany w zakresie globalnym (lub w szczególności nie jest zdefiniowany w zakresie dostępnym dlaupdate
); sprawdź naszą konsolę.balls.splice()
zp
.Uncaught ReferenceError: asplode is not defined
. Funkcjaasplode()
nie jest widoczna.asplode
nie ma odpowiedniego zakresu,setInterval
powinien otrzymać odniesienie do funkcji,splice
potrzebuje indeksu - a może świat się kurczy z tobą jsfiddle.net/5f85bOdpowiedzi:
Twój kod ma kilka problemów.
Po pierwsze, w twojej definicji:
asplode
jest lokalny dla zakresu wewnątrzshrink
i dlatego nie jest dostępny dla kodu, wupdate
którym próbujesz go wywołać. Zakres JavaScript jest oparty na funkcjach, więcupdate
nie można go zobaczyć,asplode
ponieważ nie ma go w środkushrink
. ( W konsoli zobaczysz błąd taki jak:.Uncaught ReferenceError: asplode is not defined
)Możesz najpierw spróbować
asplode
wyjść pozashrink
:Jednak w Twoim kodzie występuje kilka innych problemów, które są poza zakresem tego pytania:
setInterval
oczekuje funkcji.setInterval(shrink(p), 100)
PowodujesetInterval
, aby uzyskać wartość zwracana z natychmiastowym wywoływanyshrink(p)
. Prawdopodobnie chceszTwój kod
for (var i = 0; i < 100; i++) { p.radius -= 1; }
prawdopodobnie nie działa tak, jak myślisz. Spowoduje to natychmiastowe uruchomienie operacji dekrementacji 100 razy, a następnie wizualne wyświetlenie wyniku. Jeśli chcesz ponownie renderować piłkę w każdym nowym rozmiarze, będziesz musiał wykonać każde pojedyncze zmniejszenie w oddzielnym wywołaniu zwrotnym pomiaru czasu (jaksetInterval
operacja)..splice
oczekuje indeksu liczbowego, a nie obiektu. Możesz uzyskać indeks numeryczny obiektu za pomocąindexOf
:Przed pierwszym uruchomieniem interwału
balls.splice
instrukcja już się wydarzyła (dokładnie 100 ms temu). Zakładam, że nie tego chcesz. Zamiast tego powinieneś mieć funkcję dekrementacji, która jest wielokrotnie wywoływanasetInterval
i ostatecznie wykonuje sięballs.splice(p,1)
po niejp.radius == 0
.źródło
To nie robi tego, co myślisz. To wywołuje
shrink
, przekazujep
, a następnie przekazuje wynik dosetInterval
.shrink(p)
zwracaundefined
, więc ta linia tak naprawdę nie umieszcza niczego w przedziale.Prawdopodobnie chcesz:
źródło