http://jsfiddle.net/goldrunt/jGL84/42/ ini dari baris 84 di biola JS ini. Ada 3 efek berbeda yang dapat diterapkan pada bola dengan menghapus komentar baris 141-146. Efek 'bouncing' berfungsi sebagaimana mestinya, tetapi efek 'asplode' tidak menghasilkan apa-apa. Haruskah saya menyertakan fungsi 'menyusut' di dalam fungsi 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
sumber
sumber
asplode
tidak dinyatakan dalam lingkup global (atau khususnya, tidak didefinisikan dalam lingkup yang dapat diaksesupdate
); periksa konsol Anda.balls.splice()
denganp
.Uncaught ReferenceError: asplode is not defined
. Fungsinyaasplode()
tidak terlihat.asplode
tidak berada dalam ruang lingkup yang benar,setInterval
harus menerima referensi fungsi,splice
membutuhkan indeks - atau mungkin dunia hanya menyusut dengan Anda jsfiddle.net/5f85bJawaban:
Kode Anda memiliki beberapa masalah.
Pertama, dalam definisi Anda:
asplode
bersifat lokal ke ruang lingkup di dalamshrink
dan oleh karena itu tidak dapat diakses oleh kode diupdate
mana Anda mencoba menyebutnya. Lingkup JavaScript berbasis fungsi, jadiupdate
tidak bisa melihatasplode
karena tidak ada di dalamshrink
. ( Di konsol Anda, Anda akan melihat kesalahan seperti:Uncaught ReferenceError: asplode is not defined
)Anda pertama mungkin mencoba bukannya bergerak
asplode
di luarshrink
:Namun, kode Anda memiliki beberapa masalah lagi yang berada di luar cakupan pertanyaan ini:
setInterval
mengharapkan suatu fungsi.setInterval(shrink(p), 100)
menyebabkansetInterval
untuk mendapatkan nilai kembali dari segera-dipanggilshrink(p)
. Anda mungkin mauKode Anda
for (var i = 0; i < 100; i++) { p.radius -= 1; }
mungkin tidak melakukan apa yang Anda pikirkan. Ini akan segera menjalankan operasi pengurangan 100 kali, dan kemudian secara visual menunjukkan hasilnya. Jika Anda ingin merender ulang bola di setiap ukuran baru, Anda harus melakukan setiap pengurangan individu di dalam callback waktu yang terpisah (sepertisetInterval
operasi)..splice
mengharapkan indeks numerik, bukan objek. Anda bisa mendapatkan indeks numerik suatu objek denganindexOf
:Pada saat interval Anda berjalan untuk pertama kalinya,
balls.splice
pernyataan tersebut telah terjadi (tepatnya sekitar 100 ms yang lalu, tepatnya). Saya berasumsi bukan itu yang Anda inginkan. Sebagai gantinya, Anda harus memiliki fungsi pengurangan yang berulang kali dipanggil olehsetInterval
dan akhirnya melakukanballs.splice(p,1)
setelahnyap.radius == 0
.sumber
Ini tidak melakukan apa yang Anda pikirkan. Ini memanggil
shrink
, meneruskannyap
, dan kemudian meneruskan hasilnya kesetInterval
.shrink(p)
kembaliundefined
, jadi baris ini tidak benar-benar menempatkan apa pun pada interval.Anda mungkin ingin:
sumber