आपके कोड में कुछ समस्याएं हैं।
सबसे पहले, अपनी परिभाषा में:
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यह नहीं देख सकता 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 पहले हुआ था, सटीक होने के लिए)। मुझे लगता है कि आप क्या चाहते हैं नहीं है। इसके बजाय, आप एक decrementing समारोह है कि बार-बार से बुलाया जाता है होना चाहिए setIntervalऔर अंत में प्रदर्शन balls.splice(p,1)के बाद p.radius == 0।
asplodeवैश्विक दायरे में घोषित नहीं किया गया है (या विशेष रूप से, सुलभ में परिभाषित नहीं हैupdate); हमारे कंसोल की जाँच करें।